Integer的highestOneBit方法源碼解析

在讀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

發佈了83 篇原創文章 · 獲贊 351 · 訪問量 65萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章