| 運算符 | 名稱 | 行為 | 高位填充 |
|---|---|---|---|
<< | 左移 | 向左移動指定位數 | 低位補 0 |
>> | 有號右移 | 向右移動指定位數 | 符號擴展:正補 0、負補 1 |
>>> | 無號右移 | 向右移動指定位數 | 零擴展:無論正負皆補 0(Java 獨有,C/C++ 無) |
char、byte、short → 運算前自動轉 int,只用右側 5 位(防止過度移位)long → 結果為 long,只用右側 6 位byte b = -1; // 二進制: 11111111 b >>>= 10; // 預期: 0000000000... (補 0) // 實際 Java 1.0/1.1: 自動轉 int 再移位,零擴展失效,結果為 -1
測試代碼驗證當前 JVM 實現:
public class URShift {
public static void main(String[] args) {
int i = -1; i >>>= 10; System.out.println(i);
long l = -1; l >>>= 10; System.out.println(l);
short s = -1; s >>>= 10; System.out.println(s);
byte b = -1; b >>>= 10; System.out.println(b);
}
}
<<=、>>=、>>>=:左側值按右側位數移位,結果賦回左側。
完整範例展示所有位運算符對 int/long 的效果,含最大/最小值、補碼表示、各類移位運算的二進制輸出。關鍵觀察點:
~i(按位非)vs -i(取負)的二進制差異>>(符號擴展)vs >>>(零擴展)對負數的不同結果