关于两个变量互换的问题

来源:互联网 发布:暗黑地牢存档位置mac 编辑:程序博客网 时间:2024/06/06 05:30

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

    int a;
    int b;

ab的值互换,代码为:  

    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;   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 = ^

现在,你可以定义你自己的函数FG

原创粉丝点击