1. 程式人生 > 其它 >Java : Java中的有符號右移運算>>和無符號右移運算>>>,原碼、反碼、補碼的簡單介紹

Java : Java中的有符號右移運算>>和無符號右移運算>>>,原碼、反碼、補碼的簡單介紹

時不時地會被這兩個繞一下,乾脆寫個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));
    }
}