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。
a1 = A ^ Bb1 = B ^ a1 = B ^ (A ^ B) = A (因 X ^ X = 0, X ^ 0 = X)a2 = a1 ^ b1 = (A ^ B) ^ A = B最終 a2 = B, b1 = A,完成交換。
swap(x, x) 導致 x = 0。傳統暫存變數法無此問題。temp = a; a = b; b = temp; 一眼明瞭,XOR 需心算驗證。@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 交換是位元運算教學經典,展現 ^ 自逆性質。但實務開發中,**請使用暫存變數**,代碼更清晰、安全、效能不遜色。面試若遇到,說明原理後補充「生產環境不建議使用」即展現專業素養。