捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
两个变量的值的交换方法
关键字:变量 交换 赋值 算法 汇编
来 自:转载,网上收集
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:初级 完成时间:2008/3/28
发布者:luohaolqitfk 发布时间:2008/3/31
编辑器:D2007 语  种:简体中文
分 类:杂项 下载浏览:1759/7896
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
网上收集的两个变量的值的交换方法。
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论9条 当前显示最后6条评论
vliren 2008/4/5 20:48:34
方法灵活,有见底!
w77l 2008/4/8 14:43:26
这个与茴写法有几不一样吧,这个有意义的啊,我觉得要做加密算法就可能用得上。
kaikai_xp 2008/4/11 14:58:30
push Num1
push Num2
pop Num1
pop Num2

这个IDEA很好
ryyd 2008/4/11 22:06:42
a=a+b
b=a-b
a=a-b
iamy 2008/4/13 18:49:22
哪一种方法的效率更高一些呢?
iamy 2008/4/13 21:32:24
我分析了一下


执行代码
==========

中间变量:
----------
Temp := Num1;
Num1 := Num2;
Num2 := Temp;


加减:
----------
Num1 := Num1 + Num2;
Num2 := Num1 - Num2;
Num1 := Num1 - Num2;
    
乘除:
----------
Num1 := Num1 * Num2;
Num2 := Num1 div Num2;
Num1 := Num1 div Num2;

异或:
----------
Num1 := Num1 xor Num2;
Num2 := Num1 xor Num2;
Num1 := Num1 xor Num2;
  
push/pop:
----------
Push Num1
Push Num2
Pop Num1
Pop Num2  
  
  

执行次数:1,000,000,000
执行时间单位:毫秒
==========
中间变量:1281
    加减:3218
    乘除:56125
    异或:1921
Push/Pop:5656
     XOR:4890
     
分析
==========
很明显,速度最快的是采用中间变量的方法
来说明一下为什么吧,从汇编级来解释就很清楚了


中间变量:
----------
mov edx,ebx
mov ebx,esi
mov esi,edx

这里执行的方法实际上是3个move的操作

加减:
----------
add esi,ebx
mov edx,esi
sub edx,ebx
mov ebx,edx
sub esi,ebx


一共执行了5条指令一个add两个move和两个sub的操作


乘除:
----------
imul ebx,esi
mov eax,ebx
cdq
idiv esi
mov esi,eax
mov eax,ebx
cdq
idiv esi
movebx,eax

哎...这个简直是惨不忍睹...
在CPU指令系统中mul和div操作都是要较长的时钟周期的


异或:
----------
xor ebx,esi
xor esi,ebx
xor ebx,esi

三个异或操作,貌似这里的操作也是比较简洁的,不过由于xor的执行时钟周期要长过mov所以他也比不上中间变量法

push/pop:
----------
push dword ptr [ebp-$04]
push dword ptr [ebp-$08]
pop dword ptr [epb-$04]
pop dword ptr [ebp-$08]

两个push两个pop
看起来也不是很复杂,不过push和pop由于需要对栈进行操作,所以这个指令也需要比较多的CPU周期


总结
==========
鱼和熊掌不可兼得,如果想速度快,就必须多使用4个字节的内存,如果想节约那4个字节的内存就必须多花些时间。
如果你不吝惜那4个字节的内存,就使用中间变量法,如果想不另外分配内存,无疑异或的方法是最好的。
注意!
这里并没有内存非配和函数栈的出入时间,如果作为函数频繁调用的时候这个因素是要考虑进去的。
另外,以上的分析只适用用于4字节integer的情况,其他类型,比如Int64,word,等等,并不一定适用。
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表