打印

变量数值交换的三种方法

[复制链接]
1978|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
soul11201|  楼主 | 2013-6-19 22:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有a,b两个变量交换他们两个的数值,最基本的做法就是就是找个中间变量进行暂时保存,就像有两个水杯,分别装了a,b毫升的水交换两个水杯中的水量最简单的办法就是找个中间杯子c先把一个杯子(假设为a)中的水暂存在里面。然后把b杯子的水倒到杯子a里面。c倒到a里面。
类于此,交换a,b两个变量里面的值,那么就可以找个中间变量c暂存一下:
c= a;
a = b;
b = c;
虽然这样也完成了任务,但是却多用了一个变量。那么没有第三个变量应该怎么做呢,那么这是就出现经常用的方法就是:
    a = a+b;
    b = a- b;
    a = a - b;
这样就省去了中间变量实现了两个变量值的交换。
今天突然之间想到了第三种做法:
a = a xor b;
b = a xor b;
a = a  xor b;
用C语言来写:
a ^= b;
b ^= a;
a ^= b;
优于上面第二种方法的地方就是不会出现溢出的现象,快速,谁都直到计算机执行位运算是最快的。
当然第三种方法能用是因为异或运算符满足结合律和交换律。



相关帖子

沙发
yuri99q| | 2013-6-19 23:53 | 只看该作者
已阅.........................................

使用特权

评论回复
板凳
i55| | 2013-6-20 00:11 | 只看该作者
《高效编程的奥秘》这书已经写的很清楚了,建议楼猪找来看看。

使用特权

评论回复
地板
ups888| | 2013-6-20 01:09 | 只看该作者
本帖最后由 ups888 于 2013-6-20 01:11 编辑

第一种最可靠,第二、三种某些情况下不适用。现在计算机超快,编程首先考虑的是可靠与可维护,效率倒是次要

使用特权

评论回复
5
soul11201|  楼主 | 2013-6-20 11:02 | 只看该作者
ups888 发表于 2013-6-20 01:09
第一种最可靠,第二、三种某些情况下不适用。现在计算机超快,编程首先考虑的是可靠与可维护,效率倒是次要 ...

只要语言支持疑惑运算的话,第一种的适用的第三种也应该适用吧,第二种不适用的情况应该是出现益处的情况时候可能会出现错误吧,但是我想不出来的证明方法。

使用特权

评论回复
6
soul11201|  楼主 | 2013-6-20 11:03 | 只看该作者
i55 发表于 2013-6-20 00:11
《高效编程的奥秘》这书已经写的很清楚了,建议楼猪找来看看。

thanks,回头找一下,呵呵。

使用特权

评论回复
7
soul11201|  楼主 | 2013-6-20 11:17 | 只看该作者
ups888 发表于 2013-6-20 01:09
第一种最可靠,第二、三种某些情况下不适用。现在计算机超快,编程首先考虑的是可靠与可维护,效率倒是次要 ...

对于一些MCU节省空间还是有一定的必要,有时候。维护上更谈不上了,这么短的一段代码它在做什么,那里可能会出问题,自己也因该不会不清楚吧?和维护第一种情况也差不多,说到易读性可能没有第一种好读,但是有些异或运算基本知识的人也没什么吧,再说了,让连异或运算这种底层位运算的都不懂的人,也别让他维护了,可能基本功还没打好。维护的容易成度像这种的代码,还是由自己对位运算的基本功决定的。再说效率吧,执行一次可能现实不出来,但是当数量是海量的处理的时候比说10^9差别可能就要显示出来了吧,当然决定效率的最终还是算法,但是能然程序运行的更高效何乐爱不为呢?不能说因为现在的计算机发达了就降低自己的要求了,追求更简洁有效的东西,才是一个技术人员的终极目标吧!

使用特权

评论回复
8
金则立则翔| | 2013-6-20 11:42 | 只看该作者
:o

使用特权

评论回复
9
huangzj121| | 2013-6-20 22:57 | 只看该作者
没意思

使用特权

评论回复
10
ups888| | 2013-6-27 00:12 | 只看该作者
soul11201 发表于 2013-6-20 11:02
只要语言支持疑惑运算的话,第一种的适用的第三种也应该适用吧,第二种不适用的情况应该是出现益处的情况 ...

并不是所有类型都能拿来做异或运算

使用特权

评论回复
11
soul11201|  楼主 | 2013-6-27 12:13 | 只看该作者
ups888 发表于 2013-6-27 00:12
并不是所有类型都能拿来做异或运算

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

76

帖子

0

粉丝