在讀HashMap源碼的時候,遇到了Integer的highestOneBit靜態方法不是太理解,所以就讀了一下源碼,這裏記錄一下。
/**
* 將一個整數(二進制)設置最高位爲1,其它位爲0,然後返回改變後的值
* 如果這個整數是0返回0
* @param i
* @return
*/
public static int highestOneBit(int i) {
// 例如1000
i |= (i >> 1); // 使前2位變爲1,相當於i = i | (i >> 1); i = 1000 | 0100 = 1100
i |= (i >> 2); // 使前4位變爲1,由於上一步確保了前兩位都是1,所以這一次移動兩位,1111
i |= (i >> 4); // 使前8位變爲1,1111
i |= (i >> 8); // 使前16位變爲1,1111
i |= (i >> 16); // 使前32位變爲1,1111
return i - (i >>> 1); // i >>> 1 無符號右移,使最高位爲0,其餘位爲1,相減即得出結果,1111 - 0111 = 1000
}
1、”|“是按位操作符的或操作符,按位操作符有與操作符(&),或操作符(|),異或操作符(^),取反操作符(~),其中運算規則如下:
&:兩個輸入位都爲1纔會輸出1,否則輸出0,如:10 & 11 -> 10
|:有一個輸入位爲1就會輸出1,如:100 | 110 -> 110
^:如果輸入爲的某一個是1,但不全都是1,那麼輸出1,如:110 ^ 100 -> 010
~:這個就不用說了吧
2、”>>>“是無符號右移操作符,移位操作符分爲有符號左移位操作符(<<)、有符號右移位操作符(>>)、無符號右移操作符(>>>)。
有符號左移時低位補0;有符號右移時,若符號爲正則高位補0,反之補1;無符號右移操作符無論正負都在高位補0.
OVER