你知道異或運算嗎?

什麼是異或運算?

異或,英文爲exclusive OR,縮寫成xor
異或(xor)是一個數學運算符。它應用於邏輯運算。異或的數學符號爲“⊕”,計算機符號爲“xor”。其運算法則爲:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b兩個值不相同,則異或結果爲1。如果a、b兩個值相同,異或結果爲0。
z = x ⊕ y
z = x xor y
以上兩個式子是等價的

– 引用自百度百科

如何理解異或

兩種方法理解異或

  1. 二進制計算
    在我們最初學習編程語言的時候,一定遇到過一個問題:
    如何交換兩個變量的值?假設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
    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
    
    在c/c++中我們可以用來交換指針:
    *p = *p ^ *s ;
    *s = *p ^ *s ;
    *p = *p ^ *s ;
    
    是不是很神奇?不過,可能這樣的理解還是不夠直觀,我們可以藉助集合來理解
  2. 韋恩圖
    1. 假設我們有兩個集合A,B,它們有一塊公共的交集。那麼在A∨B的情況下,是下面這張圖:
      在這裏插入圖片描述
    2. 如果按照xor運算,它就會變成(¬A ∧ B) ∨ (A ∧¬B):
      在這裏插入圖片描述
    3. B = Aoxr(AoxrB) = A
      在這裏插入圖片描述
    4. A = Boxr(Aoxr(AoxrB)) = B
      在這裏插入圖片描述
      — 圖片來自wikipeida
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章