关于两个对象交换的问题

来源:互联网 发布:淘宝助理怎么修改价格 编辑:程序博客网 时间:2024/04/30 05:41

将两个变量的值互换,相当简单的问题。假设有变量a、b:

    int a;
int b;
将a、b的值互换,代码为:
    int tmp = a;
a = b;
b = tmp;

然而,如果要求不用中间变量,就交换变量的值,该怎么做呢?一个比较有效率且众所周知的方法就是三次异或操作:

    a = a ^ b; //a ^= b;
b = a ^ b; //b ^= a;
a = a ^ b; //a ^= b;
这应该是最有效率的一种方法了吧,全部都是位操作。(真的有效率吗?请见后续文章)
但你可能要花一点时间,才能明白为什么这样可以交换两个变量的值。

现在再看另外的方法,你就会比较容易明白其中的道理了。

    a = a + b;
b = a - b;
a = a - b;
好好想想看,是什么道理呢?再联系上面的形式想想,是不是很相像呢?
其实它的原理就是加法,请看下面的式子:
    z = x + y;
y = z - x;
x = z - y;
根据加法的规则,我们只要知道其中任意两个变量的值,就可以求出第三个变量的值。因此,这三个变量中,舍弃其中任何一个,都不会导致信息的丢失。你看到的上面一例,就是通过将两个数先累加到其中一个变量中,然后再分别求得另一个变量,并同时互换了值。

那么,你想到了吗?还有什么方法来互换两个变量的值?
对了,就是用乘法:

    a = a * b;
b = a / b;
a = a / b;
通过后面两个例子的比较,你可以看出一些规律来了吧。
只要有两种操作,它们的关系类似于*/或+-,那么就可以用来交换两个变量的值。我们来尝试一下形式化的总结:
设有函数F,满足
z = F( x, y );
如果存在函数G,使得
x = G( z, y );
y = G( z, x );
那么就可以用以下的步骤来交换两个变量的值
a = F( a, b );
b = G( a, b );
a = G( a, b );
现在一切都明白了吧。
但是,难道你没有疑问吗:为什么只用异或操作就可以实现?呵呵,那是因为和“异或”相对的那个操作就是“异或”本身,也即
    若F = ^,则G = ^。