var a int = 100
var b int = 200
a = a ^ b
b = b ^ a
a = a ^ b
fmt.Println(a, b)
记 m= a ^ b, 则m ^ b = a, m ^ a= b。
第2
次交换后,b的值变为a的值,是 因为b ^ (a ^ b)
得 a。
第3
次交换后,a的值变为b的值, 是因为(a ^ b) ^ a
得b。(在上一步,b的值已经变换成a的值了)
^
是按位异或
,异或
取反是同或
异或
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
同或
a⊙b= (a ∧ b) ∨ (¬a ∧¬b)
当变量个数为偶数
时,同或
运算和异或
运算之间具有互补
关系
当变量个数为奇数
时,同或
运算和异或
运算之间具有相等
关系
例如
¬(a⊕b)=a⊙b、 a⊕b⊕c = a⊙b⊙c
>>> a=5
>>> b=9
>>> a^b^a
9
>>> a^b^b
5
>>> a^b^a^b^a
5
>>> a^b^a^b
0
>>> a^a^b
9
>>> a^a
0
>>> a^a^a
5
>>> a^a^b
9
参考资料
同或_百度百科 (baidu.com)
异或_百度百科 (baidu.com)
三变量的同或与异或是否有取反或之间的特征? - 知乎 (zhihu.com)