常见算法之4---正整数二进制表示中的1的个数

题目:输出一个正整数的二进制中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的正次幂。

原文地址:https://www.cnblogs.com/xiaoChongUp/p/3281022.html