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

Java 位運算技巧:不使用判斷、比較、API 取得整數絕對值

     編輯:Java 程式設計入門

題目限制

  • ❌ 不可使用 Math.abs() 等 API
  • ❌ 不可使用 if、for、while、switch、? : 等判斷/迴圈
  • ❌ 不可使用 ==、<=、>=、!=、<、> 等比較運算子

核心解法

public static int abs(int num) {
    return num * (1 - ((num >>> 31) << 1));
}

原理逐步拆解

  1. num >>> 31:無符號右移 31 位
    • 正數/零 → 最高位 0 → 結果 0
    • 負數 → 最高位 1 → 移動後補 0 → 結果 1
  2. (... << 1):左移 1 位
    • 正數/零 → 0
    • 負數 → 2
  3. 1 - ...:得到乘數
    • 正數/零 → 1
    • 負數 → -1
  4. num * 乘數:正數不變,負數變正 → 絕對值

驗證表格

num>>31<<11-結果
50015
00010
-512-15
-214748364812-1-2147483648 (溢位)

⚠️ 邊界陷阱:Integer.MIN_VALUE

Math.abs(Integer.MIN_VALUE) 同樣回傳 -2147483648,因為 32 位有號整數範圍是 [-2^31, 2^31-1],+2^31 無法表示。實務上若需處理此極值,請改用 long 或 BigInteger。

測試程式

public static void main(String[] args) {
    for (int i = -5; i <= 5; i++) {
        System.out.println(i + " -> " + abs(i));
    }
    System.out.println("MIN_VALUE -> " + abs(Integer.MIN_VALUE));
}

總結

此技巧展示位運算替代條件判斷的經典應用,常見於效能敏感、無分支預測的底層程式庫。但現代 JVM JIT 編譯器對 Math.abs 已高度優化,實務開發優先使用標準 API,保持可讀性與正確性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved