题目:输出一个正整数的二进制中1的个数。
示例:10(二进制为1010),则输出2
方案一:
基本思想:使用除法,不断除以2,记录余数为1时的次数。
代码:
while(i!=0){
if(i%2!=0)
num++;
i = i/2;
}
方案二:
基本思想:使用位运算(效率上高于方案一),通过不断的右移,记录最右位为1的次数。
代码:
while(i!=0){
if((i&1)!=0) //最后一位为1
num++;
i = i>>1;
}
注意:若输入为负数的时候,会导致死循环。
方案三:
基本思想:一个数的二进制减去1之后,会发生这样的改变:从最右边的1开始到最后,所有位都会变反,而其他的位不变。将两者进行&运算后,从原来最右边的1开始就都变成了0。那么,有多少个1,就有多少次这样的运算。
例:(以下都是二进制表示)
1100-1=1011,1100&1011=1000
1000-1=0111, 1000&0111=0000
一共进行了两次这样的运算(原始数中有两个1)
代码:
while(i!=0){
num++;
i =i&(i-1);
}
扩展:如何判断一个数是2的正次幂?
通过上面,我们发现,2的正次幂的二进制表示中只有一个1。
那么若n&(n-1)为0,则n就是2的正次幂。