二進位制、位運算、位移運算

HuDu發表於2020-09-02

二進位制的基本概念

    二進位制是逢2進位的進位制,01是基本算符。
    現代的電子計算機技術全部採用的是二進位制,因為它只使用0、1兩個數字符號,非常簡單方便,易於用電子方式實現。計算機內部處理的資訊,都是採用二進位制數來表示的。二進位制(Binary)數用01兩個數字及其組合來表示任何數。進位規則是“逢21”,數字1在不同的位上代表不同的值,按從右至左的次序,這個值以二倍遞增。

注:1個位元組=8位bit,符號位0代表正數,1代表負數
  • 二進位制–原碼、反碼、補碼
對於有符號的而言:

1、二進位制的最高位是符號位:0表示正數,1表示負數

2、正數的原碼、反碼、補碼都一樣

3、負數的反碼=它的原碼符號位不變,其它位取反

4、負數的補碼=它的反碼+1

50的反碼,補碼都是0

6、java沒有無符號數,換言之,java中的數都是有符號的

7、在計算機運算的時候,都是以補碼的方式來運算的。

位運算子

java中有4個位運算,分別是按位與&、按位或|、按位異或^,按位取反~,它們的運算規則是:

按位與&:兩位全為1,結果為1

按位或|:兩位有一個為1,結果為1

按位異或^:兩位一個為0,一個為1,結果為1,即同為0,異為1

按位取反:0->11->0

移位運算

java中有3個移位運算子:

>><<算術右移和算術左移,運算規則:

算術右移:低位溢位,符號位不變,並用符號位補溢位的高位

算術左移:符號位不變,低位補0

>>>邏輯右移,運算規則是:低們溢位,高位補0

程式碼例項

/**
 * 二進位制位移運算和移位運算
 */
public class test1 {
    public static void main(String[] args) {
        System.out.println("移位運算結果如下:");
        //算術右移和左移
        //算術右移:低位溢位,符號位不變,並用符號位補溢位的高位
        //記住原碼,反碼,補碼之間的關係
        //正數的原碼,反碼和補碼都一樣
        //符數的反碼,符號位不變,其餘取反,補碼為反碼在第一位加1
        //反過來也一樣
        int a = 1 >> 2;
        int b = -1 >> 2;
        //算術左移:符號位不變,低位補0
        int c = 1 << 2;
        int d = -1 << 2;
        //邏輯右移
        int e = 3 >>> 2;
        System.out.println("1 >> 2:"+a);
        System.out.println("-1 >> 2:"+b);
        System.out.println("1 << 2:"+c);
        System.out.println("-1 << 2:"+d);
        System.out.println("3 >>> 2:"+e);

        System.out.println("---------------------------");
        System.out.println("位運算結果如下");
        //~取反:按位取反,0->1,1->0
        System.out.println("~2:"+(~2));
        //&與:兩個全為1,結果為1
        System.out.println("2&3:"+(2&3));
        //|或:兩個中有一個為1,結果為1
        System.out.println("2|3:"+(2|3));
        //^異或:兩位一個為0,一個為1,結果為1,即同為0,異為1
        System.out.println("-3^3:"+(-3^3));
    }
}

計算過程

注意:計算機運算的時候,都是以補碼的方式來運算的,如果補碼計算結果負數,則需要把補碼轉為原碼

1>>2

1的原碼
00000000 00000000 00000000 00000001
因為正數的原碼、反碼、補碼都一樣
所以1的補碼
00000000 00000000 00000000 00000001
算數右移2位結果
00000000 00000000 00000000 00000000
所以1>>2=0 
推匯出1>>n(n>1的正整數) 結果都為0


-1>>2
-1的原碼
10000000 00000000 00000000 00000001
-1的反碼
11111111 11111111 11111111 11111110
-1的補碼
11111111 11111111 11111111 11111111
算數右移2位結果
11111111 11111111 11111111 11111111
補碼->反碼 :-1
11111111 11111111 11111111 11111110
反碼->原碼
10000000 00000000 00000000 00000001
所以-1>>2=-1
推匯出-1>>n(n>1的正整數) 結果都為-1


3>>>2

3的原碼

00000000 00000000 00000000 00000011

因為正數的原碼、反碼、補碼都一樣

所以3的補碼

00000000 00000000 00000000 00000011


>>>邏輯右移2位結果為

00000000 00000000 00000000 00000000
所以3>>>2=0

~2
2的原碼補碼相同
2的補碼
00000000 00000000 00000000 00000010

按位取反~

11111111 11111111 11111111 11111101
因為第1為是1,為負數,所以要-1,其它位取反得原碼結果
-1
11111111 11111111 11111111 11111100
其它位取反
10000000 00000000 00000000 00000011
所以結果為-3
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章