原理
首先我们需要知道异或(^)计算:相同为0,不同为1。
所以,进行异或计算的结果相当于是结合了两个值的特征。
从中我们也可以知道,如果两个相同的值进行异或的话,则得到的结果为0。
实战
编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
示例:
输入: numbers = [1,2]
输出: [2,1]
提示:
numbers.length == 2
public int[] swapNumbers(int[] numbers) {
numbers[0]=numbers[0]^numbers[1];
numbers[1]=numbers[0]^numbers[1];
numbers[0]=numbers[0]^numbers[1];
return numbers;
}
解析
我想你们一定很困惑,为什么这样就能交换两个值了?
ok,那我们下面就来分解一下上面的三个步骤
- 进行a,b两个值的异或计算,得到两个值不同的地方,即特征值让a等于它。
- 让a与b进行异或计算。前面说了,如果两个相同的值进行异或计算,则为0,这是通过异或计算本身的原理得到的结果,也可以自己动手亲自计算一下。所以这计算得到的结果就是原来a的值,因为b已经被消除掉了。让b等于这个值,所以b的值就是原来a的值。
- 即 a ^ b ^ b=a
- 让 a再与b进行异或计算,此时a的值是原来一开始a^b的结果,而b的值是原来a的值。所以这样进行异或计算,又消去了a的值,得到的结果就是原来b的值。
- 即 a ^ b ^ a=b
- 这样就完成了两个值的交换。