怎样不用中间变量temp 实现两个数交换
来源:互联网 发布:图章制作软件在线 编辑:程序博客网 时间:2024/05/01 03:49
转自 : http://blog.csdn.net/tianshuai11/article/details/7025398
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:
(1)加减法。
a = a + b;
b = a - b;
a = a - b;
该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:
a = 3.123456
b = 1234567.000000
交换后各变量值变为:
a = 1234567.000000
b = 3.125000
很明显,原来a的值在交换给b的过程中发生了精度损失。
(2)乘除法。
a = a * b;
b = a / b;
a = a / b;
乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。
可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。
(3)异或法。
a ^= b;//a=a^b
b ^= a;//b=b^(a^b)=b^a^b=b^b^a=0^a=a
a ^= b;//a=(a^b)^a=a^b^a=a^a^b=0^b=b
异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。
第二类方法更像是玩了一个文字游戏,此种方法采用了在代码中嵌入汇编代码的方法避免了临时变量的引入,但究其本质还是会使用额外的存储空间。此种方法可以有很多种,下边列出几种:
(1)使用xchg指令,这也是比较直观、容易想到的方法,因为xchg指令的功能就是交换源操作数和目的操作数的值,这里要使用额外寄存器来暂存变量。内嵌汇编代码如下:
_asm
{
mov eax,a
xchg b,eax
mov a,eax
}
(2)使用额外的栈。这里使用反向的出栈顺序来完成交换。内嵌代码有如下两种形式:
_asm
{
push a
push b
pop a
pop b
}
另一种形式:
_asm push a
a = b;
_asm pop a
(3)使用mov指令。这种方法使用额外寄存器来暂存一个变量的值。
_asm mov eax,a
a = b;
_asm mov b,eax
其实第二类方法并不合格,它虽然没有显式的使用临时变量,但还是会用到额外的存贮空间。不过也不能说没有必要掌握,从实用的角度看还是很“有用”的。不是有公司出过这样的面试题吗?“不使用加减法和异或法完成不使用中间变量交换两个数值型变量的值”。此时或许只好使用这种方法了。
- 怎样不用中间变量temp 实现两个数交换
- 【C++】怎样不用中间变量temp 实现两个数交换
- 怎样不用中间变量temp 实现两个数交换
- 怎样不用中间变量temp 实现两个数交换
- [C/C++] 怎样不用中间变量temp 实现两个数交换
- 两个数间的交换(按位操作不用中间变量temp即可实现两个数据的交换)C++按位与运算交换数据vs2013环境
- 不用中间变量实现两个数的交换
- 不用中间变量交换两个数
- 不用中间变量交换两个数
- 不用中间变量交换两个数
- 不用中间变量进行两个数的交换(C语言)
- 不用中间变量交换两个数的值的方法
- 不用中间变量交换两个数的陷阱
- 位操作(一)交换两个数不用中间变量
- 不用中间变量,交换两个数的值
- 不用中间变量交换两个数的值
- 不用中间变量,实现两个变量的交换
- 【转】 不用中间变量,实现两个变量的交换
- linux中getopt的用法
- php寫出Excel報表格式或函數
- C#开发的GDAL程序部署遇到的问题 (无法加载 DLL“gdal_wrap” Unable to load DLL 'gdal_wrap')
- 走近“so,neither”开头的倒装句
- Pocketbuilder,嵌入式开发的另一选择
- 怎样不用中间变量temp 实现两个数交换
- 编码字符集与字符集编码的区别(转)
- .NET 页面之间的传值
- 重学数据结构007——二叉查找树
- ExtJS中Ext.Ajax.request与form.getForm().submit的基本区别
- 使用APIHOOK实现进程隐藏
- 关于 for update
- 说说字符集和编码
- GDAL库的编译