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