定义两个变量:
int a = 1;
int b = 2;
现在要把a和b的值交换,一般我们最先想到的方法就是:
先定义一个中间变量:
int c ;
然后开始交换:
c = a;
a = b;
b = c;
这样就交换完毕了。
在上一种交换方法中必须定义一个中间变量才能完成交换功能,这样就会多占用内存。那么有木有不用新建变量就能完成交换呢?
第二种方法就是不用定义中间变量就能完成交换功能的方法:
a = a + b;
b = a - b; // 此时的a已经不是原来的a 了,此时 a = a + b;
a = a - b; //此时的a和b都不是原来的a和b了,此时的 a 是原来两个变量的和,此时的 b 是原来的变量a 的值。
这种方法就没有定义新的变量就完成了交换功能,可是问题也有,如果a与b 的和超出int类型的最大值呢?就会有精度的损失。
那么就没有又不用定义中间变量,又不用担心会损失精度的方法了吗?
有滴!这是第三种方法,这种方法比较有技巧性(本方法采用的是位运算中的技巧:a = a ^ b ^ b,也就是一个数连续与另一个数进行两次与运算结果还是这个数本身):
a = a ^ b;
b = a ^ b;//此时的a已经不是原来的a了,此时右边的表达式就等价于:( a ^ b ) ^ b ,结果是a,并把它赋予变量b;
a = a ^ b;//此时的a与b都不是原来的a与b了,此时右边的表达式就等价于:a ^ ( a ^ b ) ,结果是b,并把它赋予变量a;
这种方法技巧性比较强,而且运算速度比较快,节省内存,但是一般不好想,所以一般在程序编程中我们还是用第一种方法的时候最多。