方法1:除二取余
注意:函数参数要定义为unsigned int(无符号整型),这样确保复数进来也可以被统计,如-1的补码为11111111111111111111111111111111(32个1)就可以被统计。
int count_bit(unsigned int n)
{
int count = 0;
while(n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int n;
int count;
scanf("%d", &n);
count = count_bit(n);
printf("count = %d\n", count);
return 0;
}
方法2:使用移位操作符,向右移位。移位后按位与1,求出的结果如果为1,count++;为0 跳过
如:-1 二进制位 11111111111111111111111111111111
& 0000000000000000000000000001
= 0000000000000000000000000001
如: 100
& 001
= 000
函数程序如下,main函数与方法1相同。
int count_bit(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)//整型为32位
{
if ((n >> i) & 1 == 1)
count++;
}
return count;
}
其实没必要完全移动32位,可以在循环中加入判断如n>>i == 0时,就跳出循环。
方法3:n = n&(n-1) 按位与,每次消去一个1
代码如下:
int count_bit(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
这个算法效率最高,最简洁。