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

Java 位移運算深度解析:左移/右移/無符號右移、移位量取模規則與實戰技巧

     編輯:Java 相關知識

三大運算符

運算符名稱規則符號位處理
<<左移低位補 0,高位丟棄無符號位概念,等價乘 2n
>>帶符號右移高位補符號位(正補 0,負補 1)保持符號,等價除 2n(向下取整)
>>>無符號右移高位補 0無視符號,負數變大正數

編譯器隱式處理流程

  1. 類型提升:byte/short/char → int;long 保持。
  2. 移位量取模:
    • int 類型:n = n & 0x1F(等價 n % 32)。
    • long 類型:n = n & 0x3F(等價 n % 64)。

    因 32 位 int 移 32 位回原值,無意義;同理 long 64 位。

  3. 執行移位,產生新值(原變量不變)。

經典陷阱:移位量 ≥ 位寬

System.out.println(Integer.toHexString(0x80000000 >> 31)); // ffffffff (-1)
System.out.println(Integer.toHexString(0x80000000 >> 32)); // 80000000 (原值!)

32 % 32 = 0,等價不移位。永遠記住:移位量自動取模 32/64。

實戰技巧集錦

1. 快速 2 的冪次運算

1 << n   // 2^n,n=0..30
1L << n  // long 版,n=0..62

2. 位掩碼提取/設置/清除位

int mask = 1 << pos;
x | mask     // 設置第 pos 位為 1
x & ~mask    // 清除第 pos 位為 0
x ^ mask     // 翻轉第 pos 位
(x >> pos) & 1  // 讀取第 pos 位

3. 判斷 2 的冪次

(n & (n - 1)) == 0 && n > 0

4. 無符號右移實現邏輯右移(算術平均避免溢出)

int mid = (low + high) >>> 1;  // 等價 (low + high) / 2 但不溢出

5. BitSet 核心實現

1L << bitIndex  // JDK 內部自動取模 64,無需手寫 % 64

總結

  • 移位運算是位級編程基石,理解類型提升與移位量取模兩大隱式規則至關重要。
  • >>> 是 Java 特有(C/C++ 無無符號右移),處理無符號數值、網絡協議解析、哈希分桶時極其有用。
  • 善用位運算替代乘除模,在底層庫、高性能框架、編碼解碼中能顯著提升吞吐。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved