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

計算機程式思維邏輯 (27):深度剖析 Integer 位運算與 Flyweight 模式

     編輯:Java 綜合教學

Integer 進階位運算詳解

Integer 提供豐富的位元級操作,底層多採用《Hacker's Delight》經典演算法,效能極高。本文深度解析核心方法實現。

1. 位元翻轉

  • reverse(int i):逐 bit 翻轉(bit 0 ↔ bit 31, bit 1 ↔ bit 30...)。
  • reverseBytes(int i):以 byte 為單位翻轉(byte 0 ↔ byte 3...)。

reverseBytes 實現

public static int reverseBytes(int i) {
    return ((i >>> 24)) |
           ((i >> 8) & 0xFF00) |
           ((i << 8) & 0xFF0000) |
           ((i << 24));
}

四步移位 + 遮罩 + 或運算,完成 4 個 byte 交換。

reverse 實現(分治法)

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 迴圈快數量級。

2. 循環移位

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。

3. 位元查找與計數

方法功能範例 (20 = 0b10100)
signum符號:正 1 / 負 -1 / 零 01
lowestOneBit最低位 1 保留,其餘歸零4 (0b100)
highestOneBit最高位 1 保留16 (0b10000)
bitCount1 的個數2
numberOfLeadingZeros前導 0 個數27
numberOfTrailingZeros尾部 0 個數2

valueOf() 與 Flyweight (享元) 模式

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 類別。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved