转 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=b0⋅20+b1⋅21+...+b30⋅230+b31⋅231
要求的结果为:
b1+b2+b3+...+b30+b31
的值。
第一步i = i - ((i >>> 1) & 0x55555555);
(5的二进制为0101)得到的结果为:
i=b0⋅20+b1⋅21+…+b31⋅231−(b1⋅20+b3⋅22+b5⋅24+b31⋅230)=(b0−b1)⋅20+b1⋅21+(b2−b3)⋅22+…+b29⋅229+(b30−b31)⋅230+b31⋅231=(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;
得到的结果为:
因为最大的情况为32位1相加即 25 ,所以最后将i与0x3f做与运算即可得到结果。