什麼是異或運算?
異或,英文爲exclusive OR,縮寫成xor
異或(xor)是一個數學運算符。它應用於邏輯運算。異或的數學符號爲“⊕”,計算機符號爲“xor”。其運算法則爲:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b兩個值不相同,則異或結果爲1。如果a、b兩個值相同,異或結果爲0。
z = x ⊕ y
z = x xor y
以上兩個式子是等價的
– 引用自百度百科
如何理解異或
兩種方法理解異或
- 二進制計算
在我們最初學習編程語言的時候,一定遇到過一個問題:
如何交換兩個變量的值?假設int a = 1, b = 2,藉助一個 int 變量 tmp 暫時存儲第一個需要被賦值的變量,就可以實現,代碼如下:
可以看到我們需要一個額外的空間來完成交換,那可不可以不用額外空間交換變量的值呢?異或是一個有效的解決方案。// 注意java中只有傳值引用,要寫一個函數來交換,需要額外加入一個數組來存儲結果 public static void main(String[] args){ int a = 1, b = 2; int tmp = a; a = b; b = tmp; System.out.println("a:" + a + " b:" + b); }
根據運算法則,相同取0,不同取1。
同樣假設: a = 1, b = 2
在c/c++中我們可以用來交換指針:a = a ^ b b = a ^ b a = a ^ b //轉換成 a = 001 ^ 010 = 011 -> 3 b = 011 ^ 010 = 001 -> 1 a = 011 ^ 001 = 010 -> 2 // 是不是得到了 a = 2 , b = 1
是不是很神奇?不過,可能這樣的理解還是不夠直觀,我們可以藉助集合來理解*p = *p ^ *s ; *s = *p ^ *s ; *p = *p ^ *s ;
- 韋恩圖
- 假設我們有兩個集合A,B,它們有一塊公共的交集。那麼在A∨B的情況下,是下面這張圖:
- 如果按照xor運算,它就會變成(¬A ∧ B) ∨ (A ∧¬B):
- B = Aoxr(AoxrB) = A
- A = Boxr(Aoxr(AoxrB)) = B
— 圖片來自wikipeida
- 假設我們有兩個集合A,B,它們有一塊公共的交集。那麼在A∨B的情況下,是下面這張圖: