1. 前言

bitCount:統(tǒng)計int類型數(shù)值的二進制中1的個數(shù)。
在各種版本的面試寶典中,這個題目應(yīng)該是非常常見的了。比如《劍指offer》面試題10:二進制中1的個數(shù),《編程之美》2.1 求二進制數(shù)中1的個數(shù),實現(xiàn)方法非常之多,各有千秋。
我們來看看jdk中是如何實現(xiàn)的。
2. 源碼
相比較其他的解法,這個是非常新穎的方式,不愧于大師之筆。
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);//第1步
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);//第2步
i = (i + (i >>> 4)) & 0x0f0f0f0f;//第3步
i = i + (i >>> 8);//第4步
i = i + (i >>> 16);//第5步
return i & 0x3f;//第6步
}
解析過程:
輸入 i,
,
其中
要么為0,要么為1,則,統(tǒng)計二進制1的個數(shù),實則求
第1步:i = i - ((i >>> 1) & 0x55555555);
i >>> 1的結(jié)果
而0x55555555中 5 表示 0101,與運算就是取奇數(shù)位(取第0位,第2位,第4位...),則
(i>>>1) & 0x55555555的結(jié)果為
i = i - ((i >>> 1) & 0x55555555)的結(jié)果為(2.2+2.3)
第2步:i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
0x33333333中 表示 0011,與運算就是每四位取前兩位
i & 0x33333333的結(jié)果為
(i>>>2) & 0x33333333的結(jié)果為
i = (i & 0x33333333) + ((i>>>2) & 0x33333333)的結(jié)果為(2.5 + 2.6)
第3步:i = (i + (i >>> 4)) & 0x0f0f0f0f;
i + (i>>>4)的結(jié)果為
而0x0f0f0f0f中,與運算表示每8位取前四位,
則i = (i + (i>>>4)) & 0x0f0f0f0f的結(jié)果為
第4步:i = i + (i >>> 8);
i = i + (i>>>8)的結(jié)果為
第5步:i = i + (i >>> 16);
i = i + (i>>>16)的結(jié)果為
第5步:i & 0x3f
0x3f表示只取二進制前6位
結(jié)果為:
即為二進制1的個數(shù)
3.后言
6步法求二進制1的個數(shù),你學(xué)會了嗎?

其他
本人也是在慢慢學(xué)習(xí)中,如有錯誤還請原諒、敬請指出,謝謝!