在很多的情况下我们需要交换两个变量的值,常用且直观的方法是
void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
我们还可以用另外一种一眼看上去很卧槽的方法,那就是异或运算,当然这种方法只能用于整数型运算。
void swap(int a,int b){
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
//or like this
void swap(int *x,int *y){
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
嗯??????我擦......为啥
下图是布尔运算的代数表
由表可得:
① x^x^y == y 因为 x^x = 0 ,0^y = y; 这就是为啥能交换的原因
假设int a0=10,b0=20;
//计算过程
{
a0 = a0 ^ b0; //step 1
b0 = a0 ^ b0; //step 2
a0 = a0 ^ b0; //step 3
}
step1: int temp_a = a0 ^ b0; //不管这是个啥
step2: int temp_b = a0 ^ b0;
∵ a0 = temp_a
∴ temp_b = a0 ^ b0 ^ b0; => b = a0;
setp3: a0 = a0 ^ b0 ;
∵ a0还是等于temp_a ,b0 已经等于a0
∴ a0=tamp_a ^ b0 ; => a0 = a0 ^ b0 ^ a0; => a = b0;
交换完毕!