不用使用中间变量让两个int变量的值互换
这个问题在面试的时候出现概率很高,相信还有很多人不会
在回答这个问题前,让我们先看看异或这个运算符
什么是异或
变量的值不同时结果为1,值相同时结果为0
在java中异或的符号是 ^,具体运算结果看下表:
a | b | 值 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
正确做法
了解了什么是异或后,我们在看看看正确的做法,代码如下:
int a =2;
int b =3;
System.out.println("a="+a+",b="+b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a="+a+",b="+b);
输出结果
a=2,b=3
a=3,b=2
解释一下
神奇吧,两个变量经过3次异或后,值就互换了,示例为了大家理解方便举例变量2和3,实际上任何值都是一样的
a = 2 = 10 (二进制)
b = 3 = 11 (二进制)
第一次异或
a = a ^ b;
结果: 10 ^ 11 = 01,a = 01
第二次异或
b = a ^ b;
结果:01 ^ 11 = 10,b=10;b的值已经换过来了
第三次异或
a = a ^ b;
结果:01 ^ 10 = 11,a=11;a的值也换过来了
总结
- 异或:值不同时异或结果为1,值相同时异或结果为0
- 第一次异或的结果 等于 a b 两个变量的差异值
- 第二次,差异值异或b,结果自然就是另一个变量的值a,这个时候b=之前的a
- 第三次:差异值异或b,结果自然就是b