學習 C 語言時,會遇到「排他性邏輯和(XOR)」這個詞。特別是在處理位元運算的情況下,這個排他性邏輯和扮演非常重要的角色。 在程式中想要執行「切換位元」「加密資料」「交換變數的值」等稍微進階的操作時,XOR 運算是一個強大的武器。然而,對於初學者來說,與「AND 運算」和「OR 運算」的差異往往不易理解,容易感到混亂。 本系列將以淺顯易懂的方式,詳細說明 C 語言中排他性邏輯和的原理與用法,讓初學者也能輕鬆掌握。本文作為第一步,將說明「排他性邏輯和是什麼?」、在 C 語言中的使用方式與注意事項,並全面介紹實用的應用範例。 不僅適合已掌握 C 語言基礎、想深化位元運算理解的讀者,也對想透過小技巧提升程式碼效率的中階開發者有幫助。希望藉此契機,能讓您對 C 語言的運算有更深入的認識。
2. XOR(排他邏輯和)是什麼?
排他邏輯和(XOR:eXclusive OR)是位元運算中基本的邏輯運算之一。在 C 語言中使用 ^(插入符號)來表示。XOR 的特點是「若位元不同則為 1,若相同則為 0」這一點。
XOR 的真值表
首先,為了確認排他邏輯和的運作,讓我們來看看真值表。
A
B
A ^ B
0
0
0
0
1
1
1
0
1
1
1
0
如同此表所示,當 A 與 B 的位元不同時返回 1,若相同則返回 0。這與一般的邏輯和(OR)或邏輯積(AND)不同。
與其他邏輯運算的比較
與其他邏輯運算相比,XOR 具有一些獨特的性質。以下簡要總結其差異。
運算子
意義
條件
&
邏輯積(AND)
僅當兩者皆為 1 時為 1
|
邏輯和(OR)
只要至少有一個為 1 即為 1
^
排他邏輯和
僅當不同時為 1
相較於處理「共通性」或「包含」的 AND 與 OR,XOR 是關注「差異」的運算。這也是在需要「差異偵測」的情境,如加密或錯誤檢測時,XOR 受到重視的原因。
排他邏輯和的對稱性與可逆性
XOR 具有其他位元運算所沒有的「可逆性(可還原)」特性。 例如,考慮以下運算。
int a = 5; // 0101
int b = 3; // 0011
int result = a ^ b; // => 0110(6)
// 再次與 b XOR 即可恢復為 a
int original = result ^ b; // => 0101(5)
如此,a ^ b ^ b 會回到 a。這正是其在「資料交換」或「簡易加密」中被廣泛應用的主要原因。
3. C 語言中 XOR 運算子(^)的使用方式
C 語言中處理排他性邏輯或(XOR)時,使用 ^ 運算子。此運算子會計算整數型別之間的位元排他性邏輯或,且可用非常簡潔的語法來使用。
基本語法與使用方式
XOR 運算子的基本使用方式如下。
int a = 10; // 二進制 1010
int b = 6; // 二進制 0110
int result = a ^ b; // 1100 → 12
#include <stdio.h>
int main() {
int nums[] = {2, 3, 5, 3, 2, 5, 7};
int n = sizeof(nums) / sizeof(nums[0]);
int result = 0;
for (int i = 0; i < n; i++) {
result ^= nums[i];
}
printf("唯一的元素是: %d
", result); // 結果: 7
return 0;
}
由於 XOR 具備「a ^ a = 0」的性質,成對的元素會相互抵消,剩下唯一的那個最終會成為結果。計算量 O(n)、不需額外記憶體 的高效率,使其在演算法問題中也常被使用。