什么是异或运算?
异或,英文为exclusive OR,缩写成xor
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
z = x ⊕ y
z = x xor y
以上两个式子是等价的
– 引用自百度百科
如何理解异或
两种方法理解异或
- 二进制计算
在我们最初学习编程语言的时候,一定遇到过一个问题:
如何交换两个变量的值?假设int a = 1, b = 2,借助一个 int 变量 tmp 暂时存储第一个需要被赋值的变量,就可以实现,代码如下:
可以看到我们需要一个额外的空间来完成交换,那可不可以不用额外空间交换变量的值呢?异或是一个有效的解决方案。// 注意java中只有传值引用,要写一个函数来交换,需要额外加入一个数组来存储结果 public static void main(String[] args){ int a = 1, b = 2; int tmp = a; a = b; b = tmp; System.out.println("a:" + a + " b:" + b); }
根据运算法则,相同取0,不同取1。
同样假设: a = 1, b = 2
在c/c++中我们可以用来交换指针:a = a ^ b b = a ^ b a = a ^ b //转换成 a = 001 ^ 010 = 011 -> 3 b = 011 ^ 010 = 001 -> 1 a = 011 ^ 001 = 010 -> 2 // 是不是得到了 a = 2 , b = 1
是不是很神奇?不过,可能这样的理解还是不够直观,我们可以借助集合来理解*p = *p ^ *s ; *s = *p ^ *s ; *p = *p ^ *s ;
- 韦恩图
- 假设我们有两个集合A,B,它们有一块公共的交集。那么在A∨B的情况下,是下面这张图:
- 如果按照xor运算,它就会变成(¬A ∧ B) ∨ (A ∧¬B):
- B = Aoxr(AoxrB) = A
- A = Boxr(Aoxr(AoxrB)) = B
— 图片来自wikipeida
- 假设我们有两个集合A,B,它们有一块公共的交集。那么在A∨B的情况下,是下面这张图: