别人的代码,只不过加上了我自己的理解,都在注释里面了:
// 返回一个32位二进制数中的1的个数
// 第一种方法,每四个二进制位计算一次,共需累加八次
int bitCount_1(int num)
{
int table16[16] ={0,1,1,2, 1,2,2,3, 1,2,2,3, 2,3,3,4};
int result = table16[num & 0xf];
result += table16[(num>>4) & 0xf];
result += table16[(num>>8) & 0xf];
result += table16[(num>>12) & 0xf];
result += table16[(num>>16) & 0xf];
result += table16[(num>>20) & 0xf];
result += table16[(num>>24) & 0xf];
result += table16[(num>>28) & 0xf];
return result;
}
// 第二种方法,每八个二进制位计算一次,共需累加四次
int bitCount_2(int num)
{
int table16[16] ={0,1,1,2, 1,2,2,3, 1,2,2,3, 2,3,3,4};
int table256[256];
for(int i = 0; i < 16; ++i)
for(int j = 0; j < 16; ++j)
table256[16*i + j] = table16[i] + table16[j];
int result = table256[num & 0xff];
result += table256[(num>>8) & 0xff];
result += table256[(num>>16) & 0xff];
result += table256[(num>>24) & 0xff];
return result;
}
// 第三种方法
// 思路:先计算每相邻两个二进制位中1的个数,结果放在16对二进制位中。
// 然后再将相邻两对的数目求和,结果放在了8对(每一对占4位)中,再对相邻两对求和,结果放在了4对(每对占8位)中,一次类推,最后将剩余的两对(每对16位)相加
// 就是总的1的位数。
int bitCount_3(int num)
{
num = (num & 0x55555555) + ((num>>1) & 0x55555555);
num = (num & 0x33333333) + ((num>>2) & 0x33333333);
num = (num & 0x0f0f0f0f) + ((num>>4) & 0x0f0f0f0f);
num = (num & 0x00ff00ff) + ((num>>8) & 0x00ff00ff);
num = (num & 0x0000ffff) + ((num>>16) & 0x0000ffff);
return num;
}