最近在看位运算的一些东西,发现很多操作还是很有意思的。
为什么三次异或操作能够交换两值(整数)
背景
1 | a = 11; |
原理
任何功能的实现都是依赖于“算法”的,而算法的出现归根到底来自于生活和数理规律的总结。
位运算实际上是转为二进制进行运算的,那两个值的差异无非就是不同位上0
与1
的差别,要交换两个值就是把相同位上的不同值互换了,对于位数不同的值,补0即可。
例子
交换11
和5
,11
的2进制表示是1011
,5
的2进制表示是101
,补0就是0101
。我们知道^
操作,是只有当两个操作数不同时才返回1,其余情况返回0;利用该特性,我们先令a = 11
,b = 5
,第一次11
与5
进行^
操作,可以得到a = a ^ b => 1110
,再对b = a ^ b => 1011
,最后回到a = a ^ b => 0101
。此时已然完成交换。
结论
通过观察这个过程我们可以得到一个什么结论呢?即(a ^ b ^ b) === a
以及(a ^ b ^ a) === b
,为什么有3次异或,是因为要保存第一步的异或结果,然后在第二步中,让b
运算拿到a
的值,第三步等价于(a ^ b ^ a ^ b ^ b) === b
转换一下就是(b ^ b ^ b) === b
,再转换就是(b ^ 0) === b
,最终a
拿回b
的值。