Integer.bitCount函数解释

http://blog.csdn.net/zhouzipeng000/article/details/56676885
public static int bitCount(int i) {
        // HD, Figure 5-2
        i = i - ((i >>> 1) & 0x55555555);
        i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
        i = (i + (i >>> 4)) & 0x0f0f0f0f;
        i = i + (i >>> 8);
        i = i + (i >>> 16);
        return i & 0x3f;
    }

函数功能说明:技术整型i二进制表示中1的个数。

解释过程,设:

i=b020+b121+...+b30230+b31231

要求的结果为: b1+b2+b3+...+b30+b31 的值。
第一步i = i - ((i >>> 1) & 0x55555555);(5的二进制为0101)得到的结果为:
i=b020+b121++b31231(b120+b322+b524+b31230)=(b0b1)20+b121+(b2b3)22++b29229+(b30b31)230+b31231=(b0+b1)20+(b2+b3)22++(b28+b29)228+(b30+b31)230
第二步i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);(3的二进制为0011)得到的结果为:

i=((b0+b1)20+(b4+b5)24++(b28+b29)228)+((b2+b3)20+(b6+b7)24++(b30+b31)228=(b0+b1+b2+b3)20+(b4+b5+b6+b7)24++(b28+b29+b30+b31)228

第三步i = (i + (i >>> 4)) & 0x0f0f0f0f;(0f的二进制为00001111)中i + (i >>> 4)得到的结果为:
i+(i>>>4)=((b0+b1+b2+b3)20+(b4+b5+b6+b7)24++(b24+b25+b26+b27)224+(b28+b29+b30+b31)228)+((b4+b5+b6+b7)20+(b8+b9+b10+b11)24++(b28+b29+b30+b31)224)=(b0+b1+b2++b6+b7)20+(b4+b5+b6++b10+b11)24++(b24+b25+b26++b30+b31)224+(b28+b29+b30+b31)228

所以i = (i + (i >>> 4)) & 0x0f0f0f0f;得到的结果为:
i=(b0+b1+b2+...+b6+b7)20+(b8+b9+b10+b11+...+b14+b15)28+...+(b24+b25+b26+...+b30+b31)224

第四步i = i + (i >>> 8);得到的结果为:
i=(b0+b1+b2++b14+b15)20+(b8+b9+b10++b22+b23)28+(b16+b17+b18++b30+b31)216+(b24+b25+b26++b30+b31)224

第五步i = i + (i >>> 16);得到的结果为:
i=(b0+b1+b2++b30+b31)20+(b8+b9+b10++b30+b31)28+(b16+b17+b18++b30+b31)216+(b24+b25+b26++b30+b31)224

最后i & 0x3f;得到的结果为:

i=i=031bi

因为最大的情况为32位1相加即 25 ,所以最后将i与0x3f做与运算即可得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值