1. 程式人生 > 實用技巧 >Java 的幾種運算子

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。規則跟 | 一致

五、延伸閱讀