異或運算的性質及用途


   1.兩個數的交換

   利用異或運算可以實習一種簡單的不使用第三個數的交換方式, 代碼如下所示:

void swap(int a,int b) { a = a^b; b = a^b; a = a^b; } 

   原因是:異或運算是它本身的逆運算,故對於兩個數或是布爾變量有如下性質:

(a XOR b) XOR b = a
 補充,異或運算的簡單性質:
 1. a ⊕ a = 0
 2. a ⊕ b = b ⊕ a    //  異或運算滿足交換律
 3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;    //  異或運算滿足結合律
 4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
 5. a ⊕ b ⊕ a = b.
 6.若x是二進制數0101,y是二進制數1011
 則x⊕y=1110
 只有在兩個比較的位不同時其結果是1,否則結果為0
 即“相同為0,不同為1”.
 由上述這些性質我們可以得到異或運算的第二個應用————判斷兩個數是否相等。
 
 2.判斷兩個數是否相等
 該應用可以參照LintCode的道題目,內容如下所示:

  給出2*n + 1 個的數字,除其中一個數字之外其他每個數字均出現兩次,找到這個數字。

  樣例

  給出 [1,2,2,1,3,4,3],返回 4

  挑戰 

  一次遍歷,常數級的額外空間復雜度。(題目鏈接

  如果你考慮的是通過遍歷該數組,依次取出數組中的元素然后對其進行匹配的話。那么時間復雜度是O(N2)。

  很明顯這不是一個優質的解法,故我們可以通過將該數組中全部的數進行異或操作,最終得到的數便是我們所需要的結果。代碼如下所示:

public class Solution { /** *@param A : an integer array *return : a integer 
*一個數與0異或仍為其本身
*/ public int singleNumber(int[] A) { if (A == null || A.length == 0) { return 0; } int rst = A[0]; for (int i = 1; i < A.length; i++) { rst = rst ^ A[i]; } return rst; } }

  

  3.位數的奇偶判斷

  ^a操作就是將a中的每一位按位逐一進行異或。例如a = 1010,則^a = 1^0^1^0=0,由此可以判斷a中為1的位數是奇數還是偶數,是一個便捷的操作。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM