求整数的二进制表示中1的个数,最直接的方式是求出其二进制表示,再计算出二进制表示中1的个数。但是这种方法的效率较低。因为我们只需要统计二进制表示中1的个数,所以没有必要将整数先转化为二进制,可以在对整数处理的过程中计数。整数转化为二进制,除了直接除以2以外,位操作的右移一位可以实现同样的功能。右移过程中会将最后一们直接丢弃,因此在右移操作之前需要先判断最后一们是否为1,使用“与”操作可以实现。例如如果n的最后一样是1,那么a & 0x01 = 1,否则a & 0x01 = 0。由此可以写出实现代码:
#include <stdio.h>
int main()
{
int n, s = 0;
scanf("%d", &n);
while(n)
{
s += n & 0x01; //判断最后一位是否为1
n >> 1; // 移位操作
}
printf("%d\n", s);
return 0;
}
对于上述程序还存在可以改进的地方:操作过程中只考虑二进制表示中的“1”。具体实现如下:
#include <stdio.h>
int main()
{
int n, s = 0;
scanf("%d", &n);
while(n)
{
n &= (n - 1);
s++;
}
printf("%d\n", s);
return 0;
}