java中“>>”和“>>>”運算子的區別,
在學習它們兩者區別的時候最先知道的是: 無符號右移運算子">>>" 右移之后左邊位數全部置為0,包括符號位,菜鳥教程上的解釋如下圖(其中A=0011 1100):

它們對正數操作之后,結果是相同的,但對負數的操作,結果卻有很大不同,
對正數操作示例代碼和結果如下:
int a=16;
int b=a>>>2;
int c=a>>2;
System.out.println("a>>>2之后二進制表示為:"+Integer.toBinaryString(b));
System.out.println("a>>>2 = "+b);
System.out.println("a>>2之后二進制表示為:"+Integer.toBinaryString(c));
System.out.println("a>>2 = "+c);

對負數操作的示例代碼可將a改為 -16 ,其結果如下:

從對負數的操作結果可以明顯看出來執行“a>>>2”之后,結果大了好多倍,那為什么會有這種差異呢?在計算機為了統一處理加減法操作,整數都是以補碼的形式存盤的,因為正數的補碼是其本身,所以兩種運算子操作之后結果相同,但負數的補碼是(符號位保持不變)先取反碼,之后在反碼的最后一位+1而得到的,
在-16執行 a>>>2,前兩位被置0, 符號位發生改變,所以結果變為正數,結果中二進制位數其實是30位,
在-16執行a>>2,為了保持其符號位不變,前兩位被置1,然后求得該補碼的原碼(補碼的補碼為原碼)即為其結果,
總結
兩者的區別主要在對負數的操作上,當執行無符號右移運算 >>> 時,移幾位左邊就填幾個0,而執行有符號運算 >> 時,為了保持其符號位不變,移位之后將其置為1,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/175232.html
標籤:java
上一篇:計算機科學——web
下一篇:資料結構和演算法_零基礎入門01
