在很早以前,我遇见过一个题目,说C语言里如何不使用中间变量,来交换两个变量的值。
正常的变量交换:
void swap( int * a, int * b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
而不用中间变量的方法:
void swap( int * a, int * b)
{
*a = (*a)^(*b);
*b = (*a)^(*b);
*a = (*a)^(*b);
}
其中这种说法也是有问题的,虽然表面上没有使用中间变量,但引入了计算表达式,计算过程中一样需要存储计算结果。
而且为了减少这么一个中间变量,几个字节,程序变得很难理解了,不划算。
同时增加了计算,会增大时间开销,而且写成中间变量的交换,编译器也会进行优化,说不定中间变量也相当于没用。
这个问题的作用,其实只是为了研究问题而研究问题,一种理论上的探讨把。
使用异或这种运算方式,看起来很新奇而已。
实际上,给定两个数a和b,只要一种确定的函数关系,a和b唯一对应一个f(a,b),就可以用另一个函数关系来反推a,b的值。
比如:
首先三个函数关系:
f(a,b) = y, g(y, b) = a, h(y, a) = b
要实现交换则需要:
a = f(a, b)
b = g(a, b)
a = h(a, b)
所以使用加法也一样:
void swap( int * a, int * b)
{
*a = (*a)+(*b);
*b = (*a)-(*b);
*a = (*a)-(*b);
}
只不过异或的这个函数计算关系比较特殊,反推运算和自身相同。