位计数
位计数(Counting bits set),指的是计算一个数里bit位置1的个数,例如一个8位数0xea = 0b1110 1010,位置1的个数为5。
算法说明
该算法用于计算最大为14位的数。这个算法需要在支持快速模除的64位CPU上才能达到高性能的效果。计算14位数的位置1的个数,只需要3次操作。
位计数代码
unsigned int count_14bit(unsigned int x)
{
x = (x * 0x200040008001ULL & 0x111111111111111ULL) % 0xf;
return x;
}
算法来源
算法计算过程
用abcdefghijklmn表示一个14bit数的14个bit位。
1.x * 0x200040008001ULL
x乘以0x200040008001ULL。
2.x * 0x200040008001ULL & 0x111111111111111ULL
步骤一得到的数值再与0x111111111111111ULL。
3(x * 0x200040008001ULL & 0x111111111111111ULL) % 0xf
步骤二得到的数值再取模运算0xf,就是15,,15 =
2
4
−
1
2^{4} - 1
24−1 ,相当于将每4bit的数合并在一起,从0-3,4-7,8-11,12-15,……。
最后得到结果,就是把每个bit的值相加,得到的数值就是数里bit位置1的个数。
[参考资料]
Bit Twiddling Hacks By Sean Eron Anderson
[Hacker’s Delight] 作者: Henry S. Warren Jr.