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

Java 位元 XOR 交換兩數:原理、程式碼與現代視角

     編輯:Java 相關知識

經典 XOR 交換演算法

a = a ^ b;
b = b ^ a; // 此時 b = b ^ (a ^ b) = a
a = a ^ b; // 此時 a = (a ^ b) ^ a = b

完整可執行範例

import java.util.Scanner;

public class XorSwap {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("輸入第一個整數:");
        long a = sc.nextLong();
        System.out.print("輸入第二個整數:");
        long b = sc.nextLong();

        System.out.println("交換前:a=" + a + ", b=" + b);

        // XOR 交換
        a = a ^ b;
        b = b ^ a;
        a = a ^ b;

        System.out.println("交換後:a=" + a + ", b=" + b);
    }
}

原理證明

設初始值為 A, B。

  1. a1 = A ^ B
  2. b1 = B ^ a1 = B ^ (A ^ B) = A (因 X ^ X = 0, X ^ 0 = X)
  3. a2 = a1 ^ b1 = (A ^ B) ^ A = B

最終 a2 = B, b1 = A,完成交換。

適用條件與限制

  • 僅適用於 整數型別 (byte, short, int, long, char)。
  • 不可用於浮點數 (float/double 位元表示特殊,XOR 會破壞數值)。
  • 不可用於物件參考 (Java 無指標運算)。
  • 同一變數交換會歸零:swap(x, x) 導致 x = 0。傳統暫存變數法無此問題。

現代視角:為什麼不再推薦?

  1. 可讀性差:temp = a; a = b; b = temp; 一眼明瞭,XOR 需心算驗證。
  2. 編譯器優化:JIT 會將暫存變數交換優化為寄存器操作,效能不輸 XOR,甚至更好(無資料相依鏈)。
  3. 除錯困難:中間狀態非語意值,觀察變數難理解。
  4. 並發風險:非原子操作,多執行緒下極度危險。

基準測試 (JMH)

@BenchmarkMode(Mode.AverageTime)
public class SwapBenchmark {
    @Benchmark
    public void tempSwap(Blackhole bh) {
        int a = 123, b = 456;
        int t = a; a = b; b = t;
        bh.consume(a); bh.consume(b);
    }

    @Benchmark
    public void xorSwap(Blackhole bh) {
        int a = 123, b = 456;
        a ^= b; b ^= a; a ^= b;
        bh.consume(a); bh.consume(b);
    }
}
// 結果:tempSwap 通常略快或持平,且穩定

總結

XOR 交換是位元運算教學經典,展現 ^ 自逆性質。但實務開發中,**請使用暫存變數**,代碼更清晰、安全、效能不遜色。面試若遇到,說明原理後補充「生產環境不建議使用」即展現專業素養。

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