異或運算的性質及用途

   1.兩個數的交換數組

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

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

   緣由是:異或運算是它自己的逆運算,故對於兩個數或是布爾變量有以下性質:code

(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 個的數字,除其中一個數字以外其餘每一個數字均出現兩次,找到這個數字。blog

  樣例

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

  挑戰 

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

  若是你考慮的是經過遍歷該數組,依次取出數組中的元素而後對其進行匹配的話。那麼時間複雜度是O(N2)。class

  很明顯這不是一個優質的解法,故咱們能夠經過將該數組中所有的數進行異或操做,最終獲得的數即是咱們所須要的結果。代碼以下所示:變量

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的位數是奇數仍是偶數,是一個便捷的操做。二進制

相關文章
相關標籤/搜索