关于两个变量互换的问题
来源:互联网 发布:暗黑地牢存档位置mac 编辑:程序博客网 时间:2024/06/06 05:30
将两个变量的值互换,相当简单的问题。假设有变量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; 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 = ^。
现在,你可以定义你自己的函数F和G。
- 关于两个变量互换的问题
- 关于两个变量值的互换问题
- 互换两个变量 i,j的值
- 两个整数变量的值互换!
- 对两个变量的值进行互换
- JAVA实现两个变量间的互换
- 关于两个变量值互换问题
- 只用两个变量来互换这两个变量的值
- 一、关于交换两个变量的问题
- 不用中间变量而互换两个变量的值
- 不借助第三个变量实现两个变量的互换
- 互换两个变量的值,不使用第三方变量
- 关于一行代码实现两个整型变量值互换的问题
- JAVA中互换两个变量的值的方法?
- 实现“两个变量的互换”的几种方法
- 对两个变量的值进行互换的多种方法
- 黑马程序员——两个变量数值的互换
- 实现两个变量的值互换,用“引用”做实参
- 第一篇
- word的安全模式
- stack overflow--recursive function
- 使用Jimi处理图像
- dataset中的数据关系
- 关于两个变量互换的问题
- [译]SSO解决方案大全 Single Sign-On for everyone
- Flex中自定义事件的两种方法
- px与em的区别(转95%的中国网站需要重写CSS)
- 一零年代
- C++语法细微(三)(面向对象和类)
- linux之cp/scp命令+scp命令详解
- Oracle Database 10g PL/SQL Programming - PL/SQL块之触发器简单应用
- smbclient命令行用法