求整数N的二进制形式中1的个数

/*
    解法一

    将二进制数的各位相加,结果即为1的个数。从两位二进制开始计算,以32位机为例。

    55555555h = 01010101010101010101010101010101b
    33333333h = 00110011001100110011001100110011b
    0f0f0f0fh = 00001111000011110000111100001111b
    00ff00ffh = 00000000111111110000000011111111b
    0000ffffh = 00000000000000001111111111111111b

    1) 奇偶位相加    2) 2位一组相加    3) 4位为一组相加    4) 8位为一组相加    ..
       00->00        0001->0001
       01->01        0101->0010
       10->01        0110->0011
       11->10        1010->0100
                        
*/


unsigned 
long func(unsigned long x)
{
    x 
= (x & 0x55555555UL+ ((x >> 1& 0x55555555UL);
    x 
= (x & 0x33333333UL+ ((x >> 2& 0x33333333UL);
    x 
= (x & 0x0f0f0f0fUL+ ((x >> 4& 0x0f0f0f0fUL);
    x 
= (x & 0x00ff00ffUL+ ((x >> 8& 0x00ff00ffUL);
    x 
= (x & 0x0000ffffUL+ ((x >> 16& 0x0000ffffUL);
    
return x;
}


/*
    解法二

    若
    n          = XXXXXX10000b
    n-1        = XXXXXX01111b
    n & n-1    = XXXXXX00000b
    
    将最低位起遇到的第一个1置零,计数器加1
 
*/

int bit_count(unsigned int n)
{
    
int count = 0;
    
for(; n; n &= n - 1count++;
    
return count;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值