highestOneBit
獲取一個int類型的二進制取整
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
上述代碼粗看會不理解實現原理,但是跟着推導一次就能理解算法的思想。假定一個int的二進制表達式是100001000
,這個常數的迭代過程如下:
- 第一次結束
100001000
->110001100
- 第二次結束
110001100
->111101111
- 第三次結束
111101111
->111111111
- 第四次結束
111111111
->111111111
- 第五次結束
111111111
->111111111
然後返回值爲111111111
-11111111
= 100000000
。
整個實現過程中,即爲不停的將首位1和後續的位進行與操作,並且首位1第一次複製成2個,第二次2*2複製成4個,第三次複製成2*4 = 8個(如果這個int大於2^8),以此類推,按照指數形式將首位1向後與之後,我們最後就能讓所有位全部變成1。最後右移1位然後相減,去掉首位之後的所有的1即可。
此種實現方式,簡化了迭代次數,並且由於充分利用上一次的賦值結果,所以不用考慮第三位是否成功被賦值,第五位成功被賦值等(因爲在(int)log2(n)+1)次會被賦值。