Java 提供豐富的運算符,本文系統整理邏輯運算符(&、|、^、!、&&、||)、位運算符(&、|、^、~)、移位操作符(<<、>>、>>>)的真值表、運算規則、二進制演示與常見陷阱,附速查表供開發隨時查閱。
| 運算符 | 名稱 | 規則 | 短路特性 |
|---|---|---|---|
| & | 邏輯與 | 全真才真 | 不短路,全部求值 |
| | | 邏輯或 | 一真即真 | 不短路,全部求值 |
| ^ | 邏輯異或 | 不同為真,相同為假 | 不短路 |
| ! | 邏輯非 | 真變假、假變真 | 單目運算符 |
| && | 短路與 | 全真才真 | 左假則不算右 |
| || | 短路或 | 一真即真 | 左真則不算右 |
效能建議:條件判斷優先使用 && ||,避免不必要的右側運算(如方法呼叫、複雜表達式)。
規則口訣:非零即真,1 為 true,0 為 false。
| 運算符 | 名稱 | 逐位規則 | 範例 (6 & 3) |
|---|---|---|---|
| & | 位與 | 1&1=1,其餘 0 | 110 & 011 = 010 → 2 |
| | | 位或 | 0|0=0,其餘 1 | 110 | 011 = 111 → 7 |
| ^ | 位異或 | 相同 0,不同 1 | 110 ^ 011 = 101 → 5 |
| ~ | 位取反 | 0↔1 翻轉 | ~6 = ...11111001 → -7 (補碼) |
-6 → 6 二進制 000...0110 → 取反 111...1001 → +1 → 111...1010。~n = -(n+1),~-6 = 5。int a = 10, b = 20; a = a ^ b; b = a ^ b; a = a ^ b; // 無需第三變數交換 // 加密:data ^ key → 傳輸 → 收端 ^ key 還原
| 運算符 | 名稱 | 規則 | 數學等價 | 範例 |
|---|---|---|---|---|
| << | 左移 | 低位補 0,高位丟棄 | × 2n | 3 << 2 = 12 |
| >> | 右移(算術) | 高位補符號位(正補 0,負補 1) | ÷ 2n (向下取整) | 6 >> 2 = 1 |
| >>> | 無符號右移 | 高位無條件補 0 | 無符號數 ÷ 2n | -6 >>> 2 = 1073741822 |
// 左移 3 (0011) << 2 → 1100 (12) // 3 * 4 = 12 // 右移(正數) 6 (0110) >> 2 → 0001 (1) // 6 / 4 = 1 // 右移(負數,算術) -6 (111...1010) >> 2 → 111...1110 (-2) // 符號位 1 補齊 // 無符號右移(負數) -6 (111...1010) >>> 2 → 0011...1110 (1073741822) // 高位補 0,變大正數
[] . () // 後綴 ++ -- ~ ! // 一元 * / % // 乘除模 + - // 加減 << >> >>> // 移位 < <= > >= // 關係 == != // 相等 & // 位與 ^ // 位異或 | // 位或 && // 邏輯與 || // 邏輯或 ?: // 三元 = += -= ... // 賦值
& | 同時是邏輯與位運算符,操作數為 boolean 時為邏輯,為整數時為位運算。&& || 僅接受 boolean 操作數,不可用於整數。shift & 0x1F (int) / shift & 0x3F (long)。~ 是一元運算符,優先級高於算術運算符,~a + b 等同 (~a) + b。>>> 無 <<< 對應,因左移無符號意義相同。