java|骚操作!!!如何不使用临时变量,实现交换swap。

一般,为了实现swap函数,我们会创建一个临时变量tmp
int tmp = a; a = b; b = tmp;

【java|骚操作!!!如何不使用临时变量,实现交换swap。】那么我们如何不使用临时变量来实现交换呢?
下面给出两种方法:
  1. a = a + b; // a = a + b, b = a - b; // b = (a + b) - b = a; a = a - b; // a = (a + b) - a = b;

  2. a = a ^ b; // a = a ^ b; b = a ^ b; // b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a; a = a ^ b; // a = (a ^ b) ^ a = b ^ (a ^ a) = b ^ 0 = b;

我们第一次见这两个骚操作可能会一脸懵B,下面解释下为什么可以这样做:
法一:理解一句话即可:“=” 右边的结果赋值给左边, 具体看注释即可。
法二:需要我们理解 ^ 异或,异或的骚操作可不少,具体后面可能会讲。
运算规则
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由运算规则可知,任何二进制数与零异或,都会等于其本身,即A ^ 0 = A ,A ^ A = 0
异或性质
(1)交换律: A ^ B = B ^ A
(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
具体看注释即可。

    推荐阅读