异或的一些性质:
异或性质:A xor B=A’ *B + B’ * A
恒等律:X xor 0 =X
归零律:X xor X =0
交换律:A xor B=B xor A
结合律:(A xor B) xor C=A xor(B xor C)
与、或交换律:
A · B = B · A
A + B = B + A
与、或结合律:
(A · B) · C = A · (B · C)
(A + B) + C = A + (B + C)
与、或分配律
A · (B + C)= A · B + A · C
A + B · C = (A + B) · (A + C)
摩尔定理
(A · B)’ = A’ + B’
(A + B)’ = A’ · B’
自反:
A ⊕ B ⊕ B = A ⊕ 0 = A
A ⊕ 1 = A’;
A ⊕ 0 = A;
A ⊕ A = 0;
A ⊕ A’ = 1;
异或性质的应用:
1、快速比较两个int数字是否相等 a^b==0
2、将特定位反转,0和1与1异或之后都会得到相反值
10100001 ^ 00100000 = 10000001
3、我们使用异或来判断一个二进制数中1的数量是奇数还是偶数
例如:求10100001中1的数量是奇数还是偶数; 答案:1 ^ 0 ^ 1 ^ 0 ^ 0 ^ 0 ^ 0 ^ 1 = 1,结果为1就是奇数个1,结果为0就是偶数个1
4、经典题目:不使用其他空间,交换两个值
a = a ^ b;
b = a ^ b; //a ^ b ^ b = a ^ 0 = a;
a = a ^ b;
5、一个整型数组里除了N个数字之外,其他的数字都出现了两次,找出这N个数字;
如果只有一个,将所有数字异或,最后得到的数就是该值
如果有两个,所有数字异或后得到a xor b
第二步:想办法得到 a 或者 b,假设 aXORb 为 00001001(F肯定不为0),根据aXORb 的值我们发现,值为1的位(比如从右向左第一位)表示在此位上 a 和 b 的值不同;所以,根据这个特点,我们找出来所有第一位为1的数进行异或,得到的就是 a 或者 b;
第三步:aXORb = a ^ b,假设我们已经找到了 a,根据异或特性,我们知道,b = aXORb ^ a;这样我们就可以找出 b;所以我们只需要循环两次;
已知性质 a ^ b ≤ a + b,当且仅当 (a & b) == 0 时等号成立
当 a ^ b == a + b 时,a ^ b ^ c ≤ a + b + c 成立。
但是当 a ^ b < a + b 时,只有a ^ b ^ c < a + b + c 成立。