首先移位運算符有三種:
<< : 左移運算符,
>> : 右移運算符,
>>> : 無符號右移,
無符號左移沒有意義。故沒有<<<。
實戰舉例:
正數的運算:
>>右移運算:
Integer in=24;
//用Integer類的toBinaryString方法獲得二進制表示
System.out.println(Integer.toBinaryString(in));
//右移 1 位
System.out.println(in>>1);
//右移 2位
System.out.println(in>>2);
//右移 3位
System.out.println(in>>3);
得到:
in用二進制表示:11000
右移 1 位的 in=12
右移 2 位的 in=6
右移 3 位的 in=3
不難得出結論:x >> y相當於x / 2^y 。
圖例展示移位過程:
in用二進制表示:
00000000000000000000000000011000 int類型爲8個字節佔32二進制位
右移 1 位的 in=12
00000000000000000000000000001100
右移 2 位的 in=6
00000000000000000000000000000110
右移 3 位的 in=3
00000000000000000000000000000011
同理可證:x << y 相當於 x * 2^y 。
負數的運算:
>>右移運算:
Integer in=-24;
//用Integer類的toBinaryString方法獲得二進制表示
System.out.println(Integer.toBinaryString(in));
//右移 1 位
System.out.println(in>>1);
//右移 2位
System.out.println(in>>2);
//右移 3位
System.out.println(in>>3);
得到:
in用二進制表示:11111111111111111111111111101000
右移 1 位的 in=-12
右移 2 位的 in=-6
右移 3 位的 in=-3
同樣也能得出結論:x >> y相當於x / 2^y。
相反,<<左移運算也能得出 x << y 相當於 x * 2^y 。
但是有個點得注意,因爲負數用二進制表示最高位是1,因此當負數過小時,就會出現這種情況。
Integer in=-3;
//用Integer類的toBinaryString方法獲得二進制表示
System.out.println(Integer.toBinaryString(in));
//右移 1 位
System.out.println(in>>1);
//右移 2位
System.out.println(in>>2);
//右移 3位
System.out.println(in>>3);
得到:
in用二進制表示:11111111111111111111111111111101
右移 1 位的 in=-2
右移 2 位的 in=-1
右移 3 位的 in=-1
不難看出,負數右移的界限爲-1;
這兒就可以簡單的延伸下在計算機底層的補碼原則,即:補碼=反碼+1。
1.先將-5的絕對值轉換成二進制,即爲0000 1010;
2.然後求該二進制的反碼,即爲 1111 0101;
3.最後將反碼加1,即爲:1111 0110
這個原則是爲了避免正負轉換時出現的漏洞人爲約定的原則(因爲有效果)。
具體的內容可以自行去看看~
>>>無符號位移
簡單說,10進制數字轉換爲二進制之後,在右移的過程中,左邊最高位都補0
Integer in=-3;
//右移 1 位
System.out.println(in>>>1);
得到:
右移 1 位的 in=2147483646
用二進制表示:
in用二進制表示:
11111111111111111111111111111101
右移 1 位的用二進制表示:
01111111111111111111111111111110
以上就是移位運算符的知識,差不多就這些了。