Java : Java中的有符號右移運算>>和無符號右移運算>>>,原碼、反碼、補碼的簡單介紹
阿新 • • 發佈:2022-05-06
時不時地會被這兩個繞一下,乾脆寫個demo加深記憶。
背景知識
-
java 中的整型int佔4個位元組,也就是32位,首位為符號位,0表示正數,1表示負數。
-
計算機中數值採用補碼的方式存放
規律:
-
首位為符號位,0表示正數,1表示負數
-
正整數的原碼、反碼、補碼 三碼合一
-
負整數的反碼:符號位不變,其餘按位取反
-
負整數的補碼:反碼+1,也就是符號位不變,其餘按位取反,然後再加上1
-
補碼的補碼等於原碼
ps: java中可以使用Integer.toBinaryString()來獲取一個整數的補碼表示,注意這裡是補碼,不是原碼,原碼=補碼的補碼。
有符號右移運算>>
1.將正整數11有符號右移3位:
+11>>
很容易看出:
對於正整數:有符號右移n位,結果的補碼等於在高位補了n個0,低位溢位捨棄
正整數原碼、反碼和補碼 三碼合一,所以不需要操心太多。
2.將負整數-11有符號右移3位:
-11>>
注意注意,這裡的結果是補碼哦。
根據補碼的補碼等於原碼規律,可以求出原碼是:10000000000000000000000000000010,換算成整數是-2
對於負整數:有符號右移n位,結果的補碼等於在補碼的高位補了n個1,低位溢位捨棄
注意是結果的補碼,不是原碼。
無符號右移運算>>
1.將正整數11無符號右移3位:
+11>>>
這裡跟有符號右移是一樣的。
2.將負整數-11無符號右移3位:
-11>>>
可以看出是在高位補了3個0哈。
對於負整數:無符號右移n位,結果的補碼等於在補碼的高位補了n個0,低位溢位捨棄
所以無符號右移,對於正整數和負整數,結果的補碼都等於是在高位補0.
原始碼:
/** * 有符號右移和無符號右移 */ public class RightShift { public static void main(String args[]){ RightShift rightShift = new RightShift(); rightShift.signedRightShift(11); rightShift.signedRightShift(-11); rightShift.unsignedRightShift(11); rightShift.unsignedRightShift(-11); } /** * 有符號右移 * @param n */ public void signedRightShift(int n){ System.out.println(n+"的有符號右移..........."); System.out.println("引數整型是:"+n); System.out.println("引數補碼是:"+Integer.toBinaryString(n)); int a = n>>3; // 有符號右移三位 System.out.println("結果整型是:"+a); System.out.println("結果補碼是:"+Integer.toBinaryString(a)); } /** * 無法符號右移 * @param n */ public void unsignedRightShift(int n){ System.out.println(n+"的無符號右移..........."); System.out.println("引數整型是:"+n); System.out.println("引數補碼是:"+Integer.toBinaryString(n)); int a = n>>>3; // 無符號右移三位 System.out.println("結果整型是:"+a); System.out.println("結果補碼是:"+Integer.toBinaryString(a)); } }