今天看到一个使用异或交换的两个数的非常巧妙的方式,值得记录一下
假设要交换两个数a和b,可以如下这么写

a = a ^ b
b = a ^ b
a = a ^ b

最初一看很懵,写的这啥玩意,不由自主地想转化成二进制去看对不对,在想这里面有什么玄学,结果是忘了异或满足交换律和结合律,我们先来看如下几个异或的性质

  1. a ^ a = 0 a ^ 0 = a
  2. a ^ b = b ^ a 交换律
  3. (a ^ b) ^ c = a ^ (b ^ c) 结合律

为了表示方便,我们设a = 甲,b = 乙,则推到一下上面的代码
a = a ^ b,此时a = 甲 ^ 乙,b = 乙,下一步
b = a ^ b,此时a = 甲 ^ 乙,b = 甲 ^ 乙 ^ 乙 = 甲 ^ (乙 ^ 乙) = 甲 ^ 0 =甲,下一步
a = a ^ b,此时,b = 甲,a = 甲 ^ 乙 ^ 甲 = (甲 ^ 甲)^ 乙 = 0 ^ 乙 = 乙
从而实现了不借助第三个变量对两个变量进行交换,非常妙,我愿称为妙手。