Integer 提供豐富的位元級操作,底層多採用《Hacker's Delight》經典演算法,效能極高。本文深度解析核心方法實現。
reverse(int i):逐 bit 翻轉(bit 0 ↔ bit 31, bit 1 ↔ bit 30...)。reverseBytes(int i):以 byte 為單位翻轉(byte 0 ↔ byte 3...)。public static int reverseBytes(int i) {
return ((i >>> 24)) |
((i >> 8) & 0xFF00) |
((i << 8) & 0xFF0000) |
((i << 24));
}
四步移位 + 遮罩 + 或運算,完成 4 個 byte 交換。
public static int reverse(int i) {
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555; // 交換相鄰 1 bit
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333; // 交換相鄰 2 bit
i = (i & 0x0F0F0F0F) << 4 | (i >>> 4) & 0x0F0F0F0F; // 交換相鄰 4 bit
i = (i << 24) | ((i & 0xFF00) << 8) | ((i >>> 8) & 0xFF00) | (i >>> 24); // byte 翻轉
return i;
}
註解 HD, Figure 7-1 指向《Hacker's Delight》圖 7-1。核心思想:相鄰分組逐層交換,利用 CPU 指令級並行,比逐 bit 迴圈快數量級。
public static int rotateLeft(int i, int distance) {
return (i << distance) | (i >>> -distance);
}
public static int rotateRight(int i, int distance) {
return (i >>> distance) | (i << -distance);
}
關鍵:distance 只取低 5 位(& 0x1F),故 -8 ≡ 24 (mod 32),i >>> -8 等價 i >>> 24。
| 方法 | 功能 | 範例 (20 = 0b10100) |
|---|---|---|
signum | 符號:正 1 / 負 -1 / 零 0 | 1 |
lowestOneBit | 最低位 1 保留,其餘歸零 | 4 (0b100) |
highestOneBit | 最高位 1 保留 | 16 (0b10000) |
bitCount | 1 的個數 | 2 |
numberOfLeadingZeros | 前導 0 個數 | 27 |
numberOfTrailingZeros | 尾部 0 個數 | 2 |
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache 靜態內部類預先建立 [-128, 127] 的 256 個實例。優點:節省記憶體、提升效能、安全共享(Integer 不可變)。Boolean/Byte/Short/Long/Character 同理。這正是《設計模式》中的 Flyweight Pattern——共享細粒度物件。
valueOf() 而非 new,享受快取紅利。Character 類別。