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的位數是奇數還是偶數,是一個便捷的操作。