Java的Integer類方法解讀

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)次會被賦值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章