Java 的幾種運算子
阿新 • • 發佈:2020-07-05
一、原碼、反碼、補碼
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: 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。規則跟|
一致