如何不借助其他变量的情况下交换两个变量的值
第一次看到这个问题的时候是2016年刚学习PHP的时候,那时候看面试题看到的,大概背了一下后进来就忘了。今天学习数学的时候偶然在一个帖子看到了,有所新收获,记录一下。
新手拿到这个问题的时候,多半是手足无措的,这怎么办?
不同的语言有不同的语法糖,比如这样
//Go
a, b = b, a
//php
list($a, $b) = [$b, $a];
对于语法技巧熟练的同学可以做如上的回答。
而如果我们从数学或者信息的角度来看看这个问题呢?
a和b之间不通过第三变量实现交换,本质上其中一个变量就需要实现信息的叠加然后还原,假设信息叠加之后我们称它的值为x,x和a可以还原出b,x和b可以还原出a。比如下面这样
a = a + b;
b = a – b;
a = a – b;
类似的还有这样
a = a * b
b = a / b
a = a / b
类似的,能够实现信息叠加还原都可以。上面这两种方式有一些缺点,比如假设a和b都是一个uint8的数字,在进行加法运算和乘法运算时,可能会面临溢出的问题。下面这种方法就显得更精巧一些了。
a = a ^ b;
b = a ^ b;
a = a ^ b;
一点点额外的启发。有没有发现在信息叠加之后,原有的信息被隐藏起来了,如果原有的两份信息,一份作为密文,一份作为密钥,那么一个简单的加密算法是否就实现了呢?哈哈。