今天在论坛上看到一个简单的面试题目:如何交换两个变量
直接想到的就是:
void xchg(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
但看到下面的人回复说:不用临时变量,用异或更好,
搜索了一下,是这样实现的:
void swap(int *a,int *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
解释:
首先要明白两个等式:x ^ x = 0; x ^ 0 = x,那上述等式就可以变为:
1、a = a ^ b;
2、b = a ^ b = (a ^ b) ^b = a (此时b已经等于最初的a)
3、a = a ^ b = (a ^ b )^a = b
但实现也有不少质疑的,说这个技巧的意义完全在于应付变态的面试,所以知道就行,但绝对不能放在产品代码中。
详见:http://blog.youkuaiyun.com/Solstice/article/details/5166912
还有一种方法:加减法
void swap(int *a,int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
这个看起来应该也很明朗,只是我确实想不通,如果这样,那为什么不能用临时变量!