源碼如下:
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,即是負數的符號位)