{
int count = 0;
while(n)
{
if ( 1 == n % 2 )
++count;
n = n >> 1;
}
return count;
}
int bit_count_2 (int n)
{
int count = 0;
while(n)
{
if ( 1 == (n & 1) )
++count;
n = n >> 1;
}
return count;
}
1,2 很普通
3 的优势是处理 1 是稀疏的情况
int bit_count_3 (int n){
int count = 0;
while (n)
{
++count;
n &= n - 1;
}
return count;
}
int bit_count_4 (int n)
{
int count = 8 * sizeof(int);
n = ~n;
while(n)
{
--count;
n &= n - 1;
}
return count;
}
这个有意思,32位数作为一个 1 的计数器,
第一次计算相邻两位的 1 的个数, 总共有 16组
第二次, 把第一次之后的每两位数作为一个数,计算相邻两个数的 1 的个数, 其实就是计算原始数据的4位里的 1 的个数, 总共有 8组
第三次, 是计算 相邻 8位 里的 1 的个数,总共有 4 组
第四次, 是计算 相邻16 位里的 1 的个数,总共有 2 组
第五次, 是计算 相邻 32 位里的 1 的个数,总共有 1 组
int bit_count_5 (int n)
{
const int MASK1 = 0x55555555;
const int MASK2 = 0x33333333;
const int MASK4 = 0x0f0f0f0f;
const int MASK8 = 0x00ff00ff;
const int MASK16 = 0x0000ffff;
n = (n & MASK1 ) + ( (n >> 1 ) & MASK1 ); // 第一次
n = (n & MASK2 ) + ( (n >> 2 ) & MASK2 ); // 第二次
n = (n & MASK4 ) + ( (n >> 4 ) & MASK4 ); // 第三次
n = (n & MASK8 ) + ( (n >> 8 ) & MASK8 ); // 第四次
n = (n & MASK16) + ( (n >> 16) & MASK16 ); // 第五次
return n;
}