异或运算的性质及用途
2017-06-21 00:18
447 查看
1.两个数的交换 利用异或运算可以实习一种简单的不使用第三个数的交换方式, 代码如下所示:
给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。 样例 给出[1,2,2,1,3,4,3],返回 4 挑战 一次遍历,常数级的额外空间复杂度。(题目链接) 如果你考虑的是通过遍历该数组,依次取出数组中的元素然后对其进行匹配的话。那么时间复杂度是O(N2)。 很明显这不是一个优质的解法,故我们可以通过将该数组中全部的数进行异或操作,最终得到的数便是我们所需要的结果。代码如下所示:
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的位数是奇数还是偶数,是一个便捷的操作。
相关文章推荐
- 异或运算的性质及用途
- 异或的性质和运算
- HDU 5416 异或运算性质 思维
- 异或的性质和运算
- 异或的性质和运算
- [转]异或的性质和运算
- Zobrist Hash算法的基础:按位异或运算的性质
- 异或的性质和运算
- 利用”异或”运算的性质,对几个字符进行加密并输出密文,然后再解密。加密算法是:密钥是字符’8’,明文的每个字符和密钥进行异或运算,得到密文。密钥和密文的每个字符再次进行异或运算,重新得到明文。
- 异或的性质和运算(转)
- 异或运算的性质
- 异或运算的性质
- HDU 5344 MZL's xor (异或运算的性质)
- 异或的性质和运算
- USTCOJ 1213 取石子游戏 (经典NIM问题)及一些扩展 与(&) 或 (|)异或 (^)运算性质
- hdu1287破译密码(异或运算)
- 模运算与同余公式的性质
- C#运算符之与,或,异或及移位运算
- 异或“∧”运算的作用
- HDU4768 Flyer 二分|异或的性质|暴力