今天在论坛上看到一个简单的面试题目:如何交换两个变量
直接想到的就是:
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.csdn.net/Solstice/article/details/5166912
还有一种方法:加减法
void swap(int *a,int *b) { *a = *a + *b; *b = *a - *b; *a = *a - *b; }
这个看起来应该也很明朗,只是我确实想不通,如果这样,那为什么不能用临时变量!