java中移位運算符的簡單講解

首先移位運算符有三種:

<<      :    左移運算符,

>>      :    右移運算符,

>>>    :    無符號右移,

無符號左移沒有意義。故沒有<<<。

實戰舉例:

正數的運算:

>>右移運算:

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

以上就是移位運算符的知識,差不多就這些了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章