假设有int a = 10; int b = 30; 现在要交换这两个数,但是要求不能使用第三个变量。
方法一://存在溢出的风险,还没搞明白
int a = 10;
int b = 30;
a = a+b;
b = a-b;
a = a-b;
方法二:异或^(两个变量的内存地址不能相同,在嵌套循环遍历同一个数组的时候,使用这种交换方式就可能遇到,int i 和 int j 是同一个数组的同一个位置变量的情况,这个时候arr[i] 和 arr[j]表示的是同一个数,其内存地址也相同。这时候使用异或交换直接将该数组的该位置的值清为零)
a ^ a = 0(自己和自己异或就会清零,这里的自己是内存地址相同)
0 ^ a = a
异或^满足交换律和结合律(这个和乘法类似,也就是说很多数相乘,相乘的顺序不会影响结果)
int a = 10;
int b = 30;
a = a ^ b; //此时 a = a ^ b , b = b;
b = a ^ b; //此时 a = a ^ b , b = a ^ b ^ b = a;
a = a ^ b; //此时 a = a ^ b ^ a = b, b = a;