求整数的二进制表示中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; }