二进制中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;
}
思考:位运算其实并不难,有些规律记清楚理解了写起程序就很方便,后面还会找些位运算的题目。