不适用中间变量交换两个数值型变量的值

转载 2011年10月14日 11:06:09

不使用中间变量交换两个数值型变量的值

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:

  (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

 其实第二类方法并不合格,它虽然没有显式的使用临时变量,但还是会用到额外的存贮空间。不过也不能说没有必要掌握,从实用的角度看还是很“有用”的。不是有公司出过这样的面试题吗?“不使用加减法和异或法完成不使用中间变量交换两个数值型变量的值”。此时或许只好使用这种方法了。


相关文章推荐

不使用中间变量交换两个数值变量的值

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:(1)加减法。 a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量,...

面试---不增加变量,交换两个数值变量的值

一、加减法要想不增加变量,交换两个变量的值,可以做加减乘除运算。用对应的加减法或者乘除法都可以做到。举例:a=5;b=8。加减: a=a+b=5+8=13;b=a-b=13-8=5;a=a-b=13-...
  • will130
  • will130
  • 2015年09月22日 11:04
  • 286

不使用第三方变量交换两个数值变量的值(java语言)

面试时有时候会遇到的面试题,但其意义没多大!本文来源网络,整理由jast。 方法一、二 参考:此处 方法三 参考:此处 方法一、算术运算 简单来说,就是通过普通的+和-运算来实现。代码如下:  int...

java(引入一个中间变量,不引入中间变量)交换两个变量的值

一、描述 在不引入其它变量的情况下交换两个数,引入一个变量做中介,交换两个数的值,第一种是引入一个临时变量,第二种是将两个数的和存放在其中一个变量中,第三种方法是使用异或运算,一个数异或上任意一个数两...

C语言交换两个变量数值的几种方法

因为经常见到这类题目,就自己总结了以下几种办法 1. 创建中间变量 这是最快也是最简单的办法,例如:#includeint main() { int a=10; int b...

[C/C++] 怎样不用中间变量temp 实现两个数交换

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法。 a = a + b; b = a - b; a = a - b; 该方法...
  • aclay
  • aclay
  • 2012年10月21日 12:34
  • 1750

不借助中间变量交换两个数

不凭借其他,实现交换 一:利用自身资源,实现交换数据的两种方法 #include void print(int a, int b );int main(void) { int a = 1...

怎样不用中间变量temp 实现两个数交换

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法。      a = a + b;      b = a - b;      a ...

c语言中不需要中间变量就能实现两个数交换的几种算法

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法。 a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型...
  • Mormont
  • Mormont
  • 2016年12月17日 22:07
  • 1212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不适用中间变量交换两个数值型变量的值
举报原因:
原因补充:

(最多只允许输入30个字)