Java 的幾種運算符

一、原碼、反碼、補碼

1  用二進制表示                00000001
-1 如果只變符號位(原碼)        10000001
那麼 1 + -1 =                 10000010 = -2
-1 的反碼                     11111110       除去符號位,整體翻轉
-1 的補碼(反碼加 1)           11111111 補碼  也等於  0 - 1 的原(補)碼
1  的補碼 + -1 的補碼          10000000 = 0, 溢出 1 位

int 爲 4 個字節,32 位,1 位作爲符號位,表示大小的有 31 位

爲了方便運算,Java 整數二進制默認使用補碼錶示正數和 0 的補碼不變,負數的補碼爲反碼加 1

0:        00000000000000000000000000000000  32個0
2^32-1:   01111111111111111111111111111111  0 + 31個1
-2^31:    10000000000000000000000000000000  1 + 31個0
-2^31+1:  10000000000000000000000000000001  1 + 30個0 + 1
-1:       11111111111111111111111111111111  32個1
String s = Integer.toBinaryString(0x80000000); // 0x80000000: -2^31
  • 1111 = 15 = 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0,0001 爲 1,等於 2^0

二、移位運算符

<< : 左移運算符

num << 1,num 轉換爲二進制,長度固定,丟棄最左邊指定位數,1 位,整體向左移動 1 位,後面補 0。

以 int 類型爲例,4 個字節,32 位,表示 -2^31 ~ 2^31 - 1,10000000000000000000000000000000 ~ 01111111111111111111111111111111,最左位是符號位,當小於 2^31 - 1 時,最左邊都是 0,所以 0 代表爲正數,1 代表爲負數。

當 num 爲正數,且沒有達到最大值時,即左邊的 0 夠多時,num << 1 相當於二進制每一位轉十進制時在原來基礎上再乘以 2,相當於 num 乘以 2。達到最大值後,正數可能變負數。

>> : 右移運算符

num >> 1,num 轉換爲二進制,丟棄最右邊指定位數,1 位,整體向右移動 1 位,後面補符號位,如果 num 爲正數,補 0,如果爲負數,補 1。

當 num 爲正數時,num >> 1 相當於 num 除以 2 取整(/)。

int 類型 4 字節,正數右移 31 位變爲 0,右移 32 位相當於不移位,當大於 32 位時,先求餘,再移位。long 類型 64 位取餘。

>>> : 無符號右移運算符

丟棄最右邊指定位數,整體右移指定位,忽略符號位,後面空位都以 0 補齊。

因爲左邊沒有符號,所以沒有無符號左移。或者說,左移運算符就是無符號左移。

    public static void main(String[] args) {
        int intValue = 733183670;
        int intValue2 = -733183670;
        System.out.println(intValue + " 左移 1 位:" + (intValue << 1)); // 1466367340
        System.out.println(intValue2 + " 左移 1 位:" + (intValue2 << 1)); // -1466367340
        System.out.println(intValue + " 右移 8 位:" + (intValue >> 8)); // 2863998 (733183670/256)
        System.out.println(intValue2 + " 右移 8 位:" + (intValue2 >> 8)); // -2863999
        // 無符號右移,將數據變小,且最終爲正數
        System.out.println(intValue + " 無符號右移 8 位:" + (intValue >>> 8)); // 2863998
        System.out.println(intValue2 + " 無符號右移 8 位:" + (intValue2 >>> 8)); // 13913217
    }

733183670 << 1,左移 1 位:

圖片來自知乎

-733183670 >> 8,右移 8 位:

圖片來自知乎

-733183670 >>> 8,無符號右移 8 位:

圖片來自知乎

三、位運算符

  • 先轉換爲二進制後再運算
  • & 按位與:1&1==1 / 1&0==0 / 0&0==0,都爲 1,則爲 1,否則爲 0
  • | 按位或:1|1==1 / 1|0==1 / 0|0==0,有一個爲 1,則爲 1,否則 爲 0
  • ~ 按位非:~1==0 / ~0==1, 單位爲 bit,整數類型的話:~1==-2 -->~0b00000000000000000000000000000001==0b11111111111111111111111111111110
  • ^: 異或運算符 1^1==0 / 1^0==1 / 0^0==0,相同爲 0,不同爲 、1

四、邏輯運算符

  • && 邏輯與:當左邊表達式爲 false 時,不再計算,直接爲 false。規則跟 & 一致
  • || 邏輯或:當左邊表達式爲 true 時,不再計算,直接爲 true。規則跟 | 一致

五、延伸閱讀

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