- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
不使用第三个变量交换两个变量值
不使用第三个变量交换两个变量的值
通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下:
int a,b;
a=10; b=15;
int t;
t=a; a=b; b=t;
这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。
上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算。
1) 算术运算
简单来说,就是通过普通的+和-运算来实现。代码如下:
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
2) 指针地址操作
因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即:
int *a,*b; //假设
*a=new int(10);
*b=new int(20); //a=0,b=0
a=(int*)(b-a); //a=0,b=0
b=(int*)(b-a); //a=0,b=0
a=(int*)(b+int(a)); //a=0,b=0
通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在?
首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。这样当算法执行到“a=(int*)(b-a)”时,a的值并不是0,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元。再次,地址运算不能出现负数,即当a的地址大于b的地址时,b-a0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。
有办法解决吗?当然!以下是改进的算法:
if(ab)
{
a=(int*)(b-a);
b=(int*)(b-(int(a)0x0000ffff));
a=(int*)(b+(int(a)0x0000ffff));
}
else
{
b=(int*)(a-b);
a=(int*)(a-(int(b)0x0000ffff));
b=(int*)(a+(int(b)0x0000ffff));
}
算法做的最大改进就是采用位运算中的与运算“int(a)0x0000ffff”,因为地址中高16位为段地址,后16位为位移地址,将它和0x0000ffff进行与运算后,段地址被屏蔽,只保留位移地址。这样就原始算法吻合,从而得到正确的结果。
此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,它的执行速度比算术算法快。因为它交换的时地址,而变量值在内存中是没有移动过的。(以下称为地址算法)
3) 位运算
通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=
您可能关注的文档
- VFP命令、函数和程序语句大全.doc
- VFP 基础知识关系数据库基本概念.doc
- VFP第11部分(循环辅助语句和多重循环).ppt
- VFP第3章 数据库和表创建和使用.ppt
- VFP第五章 查询和视图.ppt
- VGA标准定义是15根针.doc
- VHDL基本语句和基本设计.ppt
- VMware ESX中虚拟机随esx开机自动启动.doc
- VOITH Coupling Vs VFD(和变频器比较1).doc
- WD-70催化剂改进.doc
- 2026-2030中国高纯氧化铝市场深度调研与投资战略分析研究报告.docx
- 2026-2030中国试验尺寸补充剂行业市场发展趋势与前景展望战略分析研究报告.docx
- 2026-2030中国液力传动油行业深度调研及投资前景预测研究报告.docx
- 2026-2030中国稳压器行业运行态势与应用前景预测报告.docx
- 2026-2030中国智能仪表物联网应用行业竞争剖析与未来营销策略创新研究报告.docx
- 2026-2030中国山羊奶制品行业市场发展趋势与前景展望战略分析研究报告.docx
- 2026-2030PETG用于医疗和制药硬包装行业市场现状供需分析及重点企业投资评估规划分析研究报告.docx
- 2026-2030中国铍行业市场发展趋势与前景展望战略研究报告.docx
- 2026-2030中国便携式电动牙线器行业市场发展趋势与前景展望战略研究报告.docx
- 2026-2030中国机房精密空调行业发展趋势及市场前景预测报告.docx
最近下载
- BP5929_CN_DS_Rev_1.1 规格书 晶丰明源LED电源.pdf VIP
- 肠造口患者造口周围皮肤损伤变化轨迹及影响因素研究.pdf
- (国家标准)GB/T 10051.1-2010 起重吊钩 第1部分:力学性能、起重量、应力及材料.pdf
- 江苏开放大学Android基础第1次形考作业.pdf VIP
- 一种水产养殖增氧剂.pdf VIP
- 环境的监视和测量控制程序.doc VIP
- 2025年四川省国家工作人员法治素养测评(卷二).docx
- 某石油化工有限公司加氢装置安全设施专篇.pdf VIP
- 厂房施工现场临时用电施工组织设计.doc VIP
- 2025-2030中国军工连接器行业发展趋势预判及市场前景预测研究报告.docx
原创力文档


文档评论(0)