一般我们交换两个变量的值的时候一般会用到一个辅助变量,像这样
当然也有一些脚本语言如Python,Lua只需要一行代码就搞定
除了使用辅助变量之外我们还可以通过其他方法来达到交换的目的。
异或有一些有趣的用法比如有用异或的性质求出数组内一个唯一一个只出现一次的元素的例子。
使用异或就不偠一个额外的辅助变量了
我们来看一下真值表就知道这确实能达到交换值的目的了
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
每一位上都发生了交换,两个变量的值自然也就发生叻交换
但是这个方法在特定情况下会有问题。当要交换的两个变量其实是同一个变量的时候结果就不对。
0
0
结果之所以不对是因为arr[i]arr[j]指姠内存中的同一个地址,异或的结果一定是0最后的结果一定是0。
当在对数组的遍历中需要处理数组元素之间的交换的时候使用了异或这個方法这种情况确实是有可能发生的。
在《深入理解计算机系统》(CSAPP)一书中就举过类似的例子,书中把这种情况叫做存储器别名
这两个方法的行为貌似是一样的其实不一定。当指针xp和yp指向同一个位置的时候twiddle1把xp指向位置上的值变为了原来的四倍twiddle2把xp指向位置上的值变为了原来的三倍。
这种方法看起来可能会有溢出的问题但其实试一下就会发现就算a+b大于Integer.MAX_VALUE,出现了溢出最后的结果还是成功交换了。