1、题目
输入一个整数,求该整数的二进制表示中1的个数,如输入9,二进制形式为1001,则1的个数为2。
2、思路
实现方式有多种,其中,采用位运算的方式效率较高,下面介绍3种位运算方式。
3、代码
3.1 将输入的数不断右移
这种方式有个缺陷,当输入一个负数,比如0x80000000,右移一次后变成0xc0000000,不断右移后,最终变成0xFFFFFFFF,陷入死循环
//a右移的方式 ,如果输入负数,如0x80000000,最终会变成0xFFFFFFFF,陷入死循环
int numOf1(int a){
int count = 0;
while(a){
if(a & 1)
count++;
a = a >> 1;
}
return count;
}
3.2 设置一个标志变量并初始为1,和原数相与,然后不断左移此变量,移动的次数和整数的位数有关
//方式2,将i不断左移与a比较,如果a是32位,需要比较32次
int numOf1_2(int a){
unsigned int i = 1;
int count = 0;
while(i){
if(a & i)
count++;
i = i << 1;
}
return count;
}
3.3 把一个整数减去1,再和原来整数相与,会把该整数最右一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的运算,基于此实现:
//方式3,把一个整数减去1,再和原来整数相与,会把该整数最右一个1变成0.
//那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的运算
int numOf1_3(int a){
int count = 0;
while(a){
++count;
a = (a - 1) & a;
}
return count;
}