异或运算与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真。转化为命题,就是:“两者的值不同。”或“有且仅有一个为真。”符号为 XOR 或 EOR 或 ⊕(编程语言中常用^
)。
基本性质:
1、交换律 a^b = b^a
2、结合律 (a^b)^c = a^(b^c)
3、对于任何数x,都有 x^x=0,x^0=x (异或自身等于0,异或0等于自身)
4、自反性 A ^ B ^ B = A ^ 0 = A
5、IF a ^ b = c THEN b ^ c = a
6、0和1 ^ 1 都和自身相反; 0和1 ^ 0都和自身相同
经典的用法:
1、快速比较两个数值是否相等
a == b a^b == 0
2、不用额外内存,交换两个数的值
a ^= b;
b ^= a;
a ^= b;
3、检验和恢复,RAID5
校验和恢复主要利用的了异或的特性:IF a ^ b = c THEN a ^ c = b
应用:一个很好的应用实例是RAID5
,使用3块磁盘(A、B、C)组成RAID5
阵列,当用户写数据时,将数据分成两部分,分别写到磁盘A和磁盘B,A ^ B
的结果写到磁盘C;当读取A的数据时,通过B ^ C
可以对A的数据做校验,当A盘出错时,通过B ^ C
也可以恢复A盘的数据。
4、使用异或使某些特定位翻转
翻转10100001
的第6位, 答案:可以将该数与00100000
进行按位异或运算; 10100001 ^ 00100000 = 10000001
5、一个整型数组里除了N个数字之外,其他的数字都出现了两次,找出这N个数字
比如,从{1, 2, 3, 4, 5, 3, 2, 4, 5}
中找出单个的数字: 1
1^2^3^4^5^3^2^4^5 = 1