无符号整型数用二进制串表示,求此串中1的个数

比方说数11,用二进制表示是1011 其中1的个数是3. 此题的求解方法有好多种,参考此文章http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html 这篇文章中有好多种算法,值得一读。这里主要再分析一下完美法的算法。算法代码如下:

int bitcount(unsigned int n)
{
    unsigned int tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111);
    return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}

这几行代码容量很大,上面的那篇文章也对此代码进行了一些讲解。这里再补充一些解释:

第一行tmp中的内容就是将n的二进制表示写出来,然后每3bit分成一组,求出每一组中1的个数,再表示成二进制的形式。

第二行中(tmp + (tmp >> 3)) & 030707070707 的作用是将tmp的二进制按6位来分组,每组中前三位加到后三位中,并将前三位都置零。

最后一步,得到二进制表示 t6t5t4t3t2t1, 其中每个t1这样的都表示6位2进制数(这6位二进制数表示的值是这原始六位数中1的个数)。所以它的值是

( 64^5*t6+64^4*t5+64^3*t4+64^2*t3+64*t2+t1 ) mod 63 = t6+t5+t4+t3+t2+t1 即为32位中1的个数和。这其中有一个知识点,就是64%63=1,(64*64)%63=1,(64*64*64)%63=1...


请举实际例子加以理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值