【Java】Integer的highestOneBit方法

源碼如下:

    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);
    }

函數作用:取 i 這個數的二進制形式最左邊的最高一位且高位後面全部補零,最後返回int型的結果。

首先了解一下出現的一些符號

1.  “>>” 右移

i>>a:i的二進制最高位向右移動a位。i是正數,最高位補0;i是負數,最高位補1

2. “|” 或運算

a|=b即a=a|b:a和b的二進制做或運算操作,結果給a

3.“>>>” 無符號右移

i>>>a: i的最高位向右移動a位。最高位補0

實現原理:

 i |= (i >>  1):將最高位向右移動一位,做或運算。結果最高位和最高位後一位均爲1。其他位可暫時忽略。

 i |= (i >>  2):將最高位向右移動兩位,做或運算。由於最高位和最高位後一位均爲1,右移兩位再去或運算,意味着最高最和後面的三位均爲1.

以此類推,運算完 i |= (i >> 16);後,i的最高位後面的位值均爲1.(因爲int佔16位,如果是long的話,需要運算到32位)

i - (i >>> 1)  最終得到的i是從開始的最高位到結束全是1。並減去i不帶符號的右移一位,即可得到一個int數據的最高位的值

上述情況是針對於i不爲零和負數的情況,如果i爲零,那麼得到的結果始終爲零。如果i位負數,那麼得到的結果始終是-2147483648。即等於Integer.MIN_VALUE。(原因在於負數的最高位始終爲1,即是負數的符號位)
       

參考:https://blog.csdn.net/jessenpan/article/details/9617749

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