Integer.bitCount函数解释

来源:互联网 发布:手机淘宝在线使用 编辑:程序博客网 时间:2024/05/16 19:14

转 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做与运算即可得到结果。

阅读全文
0 0