| 運算符 | 名稱 | 規則 | 符號位處理 |
|---|---|---|---|
<< | 左移 | 低位補 0,高位丟棄 | 無符號位概念,等價乘 2n |
>> | 帶符號右移 | 高位補符號位(正補 0,負補 1) | 保持符號,等價除 2n(向下取整) |
>>> | 無符號右移 | 高位補 0 | 無視符號,負數變大正數 |
byte/short/char → int;long 保持。int 類型:n = n & 0x1F(等價 n % 32)。long 類型:n = n & 0x3F(等價 n % 64)。因 32 位 int 移 32 位回原值,無意義;同理 long 64 位。
System.out.println(Integer.toHexString(0x80000000 >> 31)); // ffffffff (-1)
System.out.println(Integer.toHexString(0x80000000 >> 32)); // 80000000 (原值!)
32 % 32 = 0,等價不移位。永遠記住:移位量自動取模 32/64。
1 << n // 2^n,n=0..30
1L << n // long 版,n=0..62
int mask = 1 << pos;
x | mask // 設置第 pos 位為 1
x & ~mask // 清除第 pos 位為 0
x ^ mask // 翻轉第 pos 位
(x >> pos) & 1 // 讀取第 pos 位
(n & (n - 1)) == 0 && n > 0
int mid = (low + high) >>> 1; // 等價 (low + high) / 2 但不溢出
1L << bitIndex // JDK 內部自動取模 64,無需手寫 % 64
>>> 是 Java 特有(C/C++ 無無符號右移),處理無符號數值、網絡協議解析、哈希分桶時極其有用。