32位数中有多少个 1

int bit_count_1(int n)
{
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;

}


4 很好理解 1 密集的情况转成 稀疏的情况
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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值