• 二进制中1的个数


    问题描述:

    请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。

    思路分析:

    简单的立马想到将次数右移,只要与1相与的话就能算出个数了,但是位移负数时左边为了保持符号位会

    补一,例如将1101右移以为会变成1110.这样就会造成死循环。

    下面有两种可行的方法:

    1、我们可以不右移输入的数组n,首先把n和1做与运算,判断最低位是不是1,接着把1左移一位得到2再和

          n做与运算,就能判断n的次低位是不是1..这样反复左移就能n其中每一位是不是1.循环的次数即为n的二

          进制位数

    2、我们发现把一个整数减去1,都是把最后的1变成0,如果它的右边还有0的话,所有的0都变成1,而它左

         边所有的位都保持不变。例如将1100减去1得到1011。把上面的分析的总结起来就是:把一个整数减去1,

         再和原整数做与运算,会把该整数最右边的一个1变成0,那么一个二进制数中有多少个1,就可以做多少

        次这种运算。这样可以比上面减少循环次数。

    参考代码:

    int NumberOf1(int n)
    {   
        unsigned int flag = 1;
        int nCount = 0;

        while(flag)
        {
            if ((n & flag) != 0) //这里判断条件要注意
            {
                nCount++;
            }
            flag = flag<<1;  //这样n有多少位就需要左移多少位
        }
        return nCount;
    }

    int NumberOf1(int n)
    {
        int nCount = 0;
        while (n)
        {
            ++nCount;
            n = (n-1)&n;
        }
        return nCount;
    }

    思考:位运算其实并不难,有些规律记清楚理解了写起程序就很方便,后面还会找些位运算的题目。

  • 相关阅读:
    1、1、2、3、5、8、13、21、34...... 求第X位数是多少,2种实现方式
    数据库设计的三大范式
    Parse与TryParse的区别
    常用Lambda范例
    【转载】说说JSON和JSONP,
    Lambda表达式
    Winform部署时强名称签名mshtml.dll无效的解决方案
    .net面试问答(大汇总)
    Asp.net MVC3 一语道破
    在asp.net中使用 log4net
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4140770.html
Copyright © 2020-2023  润新知