#include
#include
//方法一:int Numberof1(int n){ int count = 0; while(n) { if(n & 1) count++; n = n >> 1; //位操作比乘除运算效率高。 } return count;}//上面的程序如果传入的n是一个负数,将造成死循环。因为负数移位时要保留符号位。//方法二:int _Numberof1(int n){ int flag = 1; int count = 0; while(flag)   //循环的次数与n的位数有关,时间复杂度高 { if(n & flag) count++; flag = flag<<1; } return count;}//方法三:int __Numberof1(int n){ int count = 0; while(n)  //有多少个1循环多少次,比较高效 { count++; n = n & (n-1); } return count;}int main(){ int sum = 20; int num1 = Numberof1(sum); int num2 =_Numberof1(sum); int num3 =__Numberof1(sum); printf("%d,%d,%d\n",num1,num2,num3); system("pause"); return 0;}

总结:

一般进行二进制操作时,都可以采用先-1,再按位与的方法。-1相当于从最右边的1到最低位,全都按位取反,再与的话,就把最右边的1置为0.