首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 位移運算符完整解析:<<、>>、>>> 與實戰應用

     編輯:Java 相關知識

位移運算符概覽

Java 提供三種位移運算符,僅支援整數型別 (byte, short, char, int, long)。運算前會將 byte/short/char 提升為 int,long 保持長整數。

運算符名稱規則等價數學運算
<<左移二進制向左移動 n 位,低位補 0,高位捨棄× 2ⁿ (無溢位時)
>>有號右移 (算術右移)二進制向右移動 n 位,高位補符號位 (正數補 0,負數補 1)÷ 2ⁿ (向零取整)
>>>無號右移 (邏輯右移)二進制向右移動 n 位,高位固定補 0無號整數 ÷ 2ⁿ

移位位數模運算

為防止移位位數過大,JVM 實際移位位數為:

  • int:n % 32 (即 n & 0x1F)
  • long:n % 64 (即 n & 0x3F)
int a = 16;
a << 34  == a << 2  // 34 % 32 = 2
a >> 33  == a >> 1  // 33 % 32 = 1

程式碼演示與輸出分析

public class ShiftOperatorDemo {
    public static void main(String[] args) {
        int a = 16; // 二進制: 10000
        int left = a << 2;   // 1000000 = 64
        int right = a >> 2;  // 100 = 4
        int unsignedRight = a >>> 2; // 正數同有號右移

        System.out.println("原值: " + a + " -> " + Integer.toBinaryString(a));
        System.out.println("左移2: " + left + " -> " + Integer.toBinaryString(left));
        System.out.println("右移2: " + right + " -> " + Integer.toBinaryString(right));
        System.out.println("無號右移2: " + unsignedRight);

        // 負數示範
        int neg = -16; // 二進制補碼: 11111111 11111111 11111111 11110000
        System.out.println("\n負數 -16:");
        System.out.println("有號右移2: " + (neg >> 2) + " -> " + Integer.toBinaryString(neg >> 2));
        System.out.println("無號右移2: " + (neg >>> 2) + " -> " + Integer.toBinaryString(neg >>> 2));
    }
}

輸出結果

原值: 16 -> 10000
左移2: 64 -> 1000000
右移2: 4 -> 100
無號右移2: 4

負數 -16:
有號右移2: -4 -> 11111111111111111111111111111100
無號右移2: 1073741820 -> 00111111111111111111111111111100

實戰應用場景

1. 高效乘除 2 的冪次

int x = 100;
int mul4 = x << 2;   // 400
int div8 = x >> 3;   // 12 (向零取整)

2. 位元掩碼與旗標操作

// 定義權限旗標
int READ = 1 << 0;   // 0001
int WRITE = 1 << 1;  // 0010
int EXEC = 1 << 2;   // 0100

int perm = READ | WRITE; // 0011 = 3
boolean canRead = (perm & READ) != 0;     // true
boolean canExec = (perm & EXEC) != 0;     // false
perm |= EXEC;              // 新增執行權限
perm &= ~WRITE;            // 移除寫入權限

3. 顏色值提取 (ARGB)

int color = 0xFF336699; // Alpha=FF, Red=33, Green=66, Blue=99
int alpha = (color >> 24) & 0xFF; // 255
int red   = (color >> 16) & 0xFF; // 51
int green = (color >> 8)  & 0xFF; // 102
int blue  = color & 0xFF;         // 153

4. 快速計算中點 (避免溢位)

int mid = (low + high) >>> 1; // 無號右移等同 (low+high)/2 但不溢位
// 或: int mid = low + ((high - low) >> 1);

5. 判斷 2 的冪次

boolean isPowerOfTwo(int n) {
    return n > 0 && (n & (n - 1)) == 0;
}

注意事項與陷阱

  • 無 <<< 運算符:左移不分有號/無號,高位捨棄,低位補 0。
  • 負數右移差異:>> 保持符號 (負數仍為負),>>> 一定變正數。
  • 長整數字面值:1L << 60 避免 int 溢位。
  • 複合賦值:a <<= 2 等同 a = a << 2,但 a 只求值一次。
  • 優先級:位移優先級低於算術運算符,高於關係/位元運算符。建議加括號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved