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

巧用異或 (XOR) 運算:從交換變數到高效查找算法

     編輯:關於C語言

異或 (XOR, ^) 是位元運算中的「魔術師」:a ^ a = 0、a ^ 0 = a、滿足交換律與結合律。善用這三大特性,能寫出極精簡、無暫存變數、甚至無分支的高效代碼。本文展示三大經典應用場景。

1. 無暫存變數交換兩整數

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

無需 temp,但注意 a 與 b 必須為不同記憶體位址,否則會歸零。

2. 陣列中找出唯一落單元素 (其餘皆成對)

int findSingle(int *arr, int n) {
    int res = 0;
    for (int i = 0; i < n; i++) res ^= arr[i];
    return res;  // 成對者抵消為 0,落單者保留
}

時間 O(n),空間 O(1),極致優雅。

3. 原文高階應用:有序陣列中判斷是否存在兩數和為 X

利用 XOR 將「大小比較」與「遞增/遞減方向」融合為單一條件,消除分支:

// 遞迴版
bool judge_rec(int *a, size_t n, int x) {
    if (n < 2) return false;
    if (x == a[0] + a[n-1]) return true;
    // (x > sum) ^ (a[0] > a[n-1]) 決定移動左邊界還是右邊界
    if ((x > a[0] + a[n-1]) ^ (a[0] > a[n-1]))
        return judge_rec(a + 1, n - 1, x);  // 移動左
    else
        return judge_rec(a, n - 1, x);      // 移動右
}

// 迭代版 (更高效)
bool judge_iter(int *a, size_t n, int x) {
    while (n > 1) {
        if (x == a[0] + a[n-1]) return true;
        if ((x > a[0] + a[n-1]) ^ (a[0] > a[n-1])) {
            a++; n--;  // 移動左邊界
        } else {
            n--;       // 移動右邊界
        }
    }
    return false;
}

核心邏輯解析

  • 陣列單調遞增:a[0] < a[n-1] 為真 (1)。若 x > sum 需增大和 → 移動左邊界 (a++);(1) ^ (1) = 0 → 走 else 分支?錯! 實際代碼中 ^ 結果為真時走 a++,故條件應為 (x > sum) ^ (a[0] > a[n-1]) 為真時移動左。
    驗證:遞增陣列 a[0] < a[n-1] → (a[0] > a[n-1])=0。若 x > sum (1) ^ 0 = 1 → 移動左 ✓;若 x < sum (0) ^ 0 = 0 → 移動右 ✓。
  • 遞減陣列同理可證。

這技巧將雙分支合併為單一 XOR 條件,減少分支預測失誤,適合極度效能敏感場合。

總結

XOR 不只是位元運算,更是演算法設計的利器。掌握「抵消」、「無暫存交換」、「條件融合」三大模式,能在面試、競技程式、系統底層優化中脫穎而出。

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