JAVA位移運算子瞭解`> >>>`
阿新 • • 發佈:2019-01-23
//如果你開始讀了,那麼一定要讀到末尾才有收穫
public static void main(String[] args) {
// 關於位移運算的測試
// 帶符號位移: << >>
int a = 1;// int型別4位元組32位 00000000 00000000 00000000 00000001
int b = -1;// 同樣是int 這個符號位怎麼表示啊?答案是用補碼錶示 11111111 11111111 11111111
// 11111111
// 但是我們怎麼判斷這個數表示的是 -1 而不是//通過以下兩個輸出可以得到結果
System.out.println(Integer.MAX_VALUE);
// 2147483647
// 01111111 11111111 11111111 11111111——也就是說第一位是符號位。
System.out.println(Integer.MIN_VALUE);
// -2147483648
// -10000000 00000000 00000000 00000000
// 補 10000000 00000000 00000000 00000000
// 接下來我們對a和b進行位移運算
System.out.println(a);
System.out.println(a >> 1);
System.out.println(a << 1);//預測2
System.out.println(b);
System.out.println(b >> 1 );
System.out.println(b << 1);//預測11111111 11111111 11111110—— -2
//輸出 1 0 2 -1 -1 -2
//帶符號右移高位空出的地方補符號位,可以理解為符號位也右移,空位補符號位
//如果向右移動符號位補全高位空缺,如果向左移動,地位空缺通通由0補全
//還有一點缺陷,我們所做的測試中用的例子的二進位制數前31位都是相同的,無法判斷符號位到底是否跟隨移動了
//也就是說左移的測試是準確的,但是右移的測試是不一定準確的接下來我們用不同的資料進行測試
int c=1610612736;//01100000 00000000 00000000 00000000
System.out.println(c << 1 );//如果符號位不動得到的就是1073741824//否則是負數
//輸出是負數那就沒有任何疑問了
//====================================================================================
// 無符號位移: 注意這裡只有右移,沒有左移>>> //預測是右移符號位不動
System.out.println(c >>> 1);//注意現在是無符號移動了——預測為 805306368
//ok了,這裡是符號位不動,空位補0
}