关于两个变量互换的问题

本文介绍了几种不使用中间变量交换两个变量值的方法,包括利用加法、减法、乘法和异或运算,并探讨了其背后的数学原理。

将两个变量的值互换,相当简单的问题。假设有变量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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值