关于两个对象交换的问题
来源:互联网 发布:淘宝助理怎么修改价格 编辑:程序博客网 时间:2024/04/30 05:41
将两个变量的值互换,相当简单的问题。假设有变量a、b:
int a;将a、b的值互换,代码为:
int 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 = ^。
- 关于两个对象交换的问题
- 关于Java交换两个对象的问题
- 关于Java交换两个对象的问题
- 关于Java交换两个对象的问题
- 关于两个对象的交换
- 关于两个对象交换的问题(实践的角度)
- 关于两个对象交换的扩展
- 一、关于交换两个变量的问题
- 关于两个值的交换
- 关于两个数的交换
- 关于两个值的交换
- 关于交换两个数的思考
- 关于交换两个值的一些讨论
- 关于交换两个变量
- 关于两个数交换
- 关于交换两个变量的不用第三个变量 异或的问题
- 交于交换两个值的问题
- 关于两个对象的比较
- EJB的专用术语解释
- Enterprise JavaBeans导论1
- Enterprise JavaBeans导论2
- Enterprise JavaBeans导论3
- WinForm中TextBox的数据类型判断
- 关于两个对象交换的问题
- html 文本框屏蔽非法字符,解决js的replace函数使光标跳到文本最后的问题
- grub
- Enterprise JavaBeans导论4
- PHP扩展简单概念
- msdn上的官方的文档,关于ie7对css的支持
- 关于两个对象交换的问题(实践的角度)
- asp.net 2.0资料
- Enterprise JavaBeans导论5