【编程之美】2.1 二进制数中1的个数
这个已经看过几遍了,列一下各种解法。
#include <stdio.h> //n&(n-1) 每次消去最低位的1 //算法复杂度与2进制中1的个数有关 int numOfOne(unsigned int n) { int num = 0; for(;n; n = n & (n - 1), num++); return num; } //利用位运算的分治算法 int numOfOne2(unsigned int n) { n = (n & 0x5555) + ((n >> 1) & 0x5555); //注意 一定要把“+”号左后分别括起来 否则会出错 n = (n & 0x3333) + ((n >> 2) & 0x3333); n = (n & 0x0f0f) + ((n >> 4) & 0x0f0f); n = (n & 0x00ff) + ((n >> 8) & 0x00ff); return n; } int main() { int a = numOfOne(678); int b = numOfOne2(678); return 0; }
上面是比较好的两种,还可以直接查找表,适合在2进制位数少或者空间充分的时候用。