二进制中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;
}

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

原文地址:https://www.cnblogs.com/Mr-Zhong/p/4140770.html