今天樓主看源碼時看到了 Java 中的移位指令,很是困惑,于是去查閱了下資料,終于搞懂了,特此記錄如下。
說明:>>> 運算符會用 0 填充高位,>> 會用符號位填充高位。
這條準(zhǔn)則在移位正數(shù)時我們看不出他的影響,但是我們來看看負數(shù)。我舉個例子, -2 >> 1 和 -2 >>> 1。
System.out.println(-2 >> 1);
System.out.println(-2 >>> 1);
// 分別輸出下面的結(jié)果
-1
2147483647
納尼,-2 >>> 1 右移一位成了 2147483647。
我來為你解開謎底。
首先我們來看看 -2 在計算機內(nèi)如何存儲。
System.out.println(Integer.toBinaryString(-2));
輸出
11111111111111111111111111111110
別害怕,這是 -2 的補碼 表示,不明白的小伙伴可以自行百度一下,或者看一下微機原理的書。
我們再回顧一下:>>> 運算符會用 0 填充高位,>> 會用符號位填充高位。
- 好,下面我們來看,>>> 情況下右移一位,用 0 補充高位則是
System.out.println(Integer.toBinaryString(-2>>> 1));
01111111111111111111111111111111
// 這是補碼的表示,我們得到他的真值為 1111111111111111111111111111111,化為十進制為 2 ** 31 -1(等比數(shù)列求和公式啊,不懂得小伙伴回去看看數(shù)學(xué)書),即 2147483647。
- 那么很簡單了啊,我們再來看 -2 >> 1,用符號位補充高位,負號符號位為 -1,
System.out.println(Integer.toBinaryString(-2>> 1 ));
11111111111111111111111111111111
11111111111111111111111111111111 這也是補碼的表示,我們對他 在取補碼 + 1 得到 他的真值為 10000000000000000000000000000001,即是 -1。
總結(jié)一下,右移的數(shù)為正數(shù)時, >> 和 >>> 沒有區(qū)別,因為正數(shù)的符號位為 0 ,右移的數(shù)為負數(shù)時,>> 和 >>> 有所區(qū)別,要加以區(qū)分。
參考資料:
Difference between >> and >>>
Bitwise and Bit Shift Operators