摘自《深入理解计算机系统》(中文版,第二版)的习题3.49,64位系统,算法如下:
long fun_c(unsigned long x ) { long val = 0; int i; for ( i = 0; i < 8; i++ ) { val += x & 0x0101010101010101L; // 注意:这里是0x表示的 x >>= 1; } val += (val >> 32); val += (val >> 16); val += (val >> 8); return val & 0xFF;}上面这个算法是把1个64位整数的8个字节分别算二进制表示时1的个数(因为1个字节有8个二进制位,所以循环8次),之后将所有的8个表示位数的值相加即可。
BTW: 如果是计算1的个数奇偶性的话,可以直接使用PF标志位。