交换两个值,这是任何一门语言书籍都会谈起的,今天我们还探讨这个看似简单,实则有点意思问题。我们用c++的语法来讲解,其他语言都可以共通!
我们假设有两个整形变量,定义如下:
int nTemp1 = 23,nTemp2 = 39;
第一种方式:借用
int nTemp = nTemp1;
nTemp1 = nTemp2;
nTemp2 = nTemp1;
该种方式完成后,nTemp1和nTemp2会正确交换。。。但是该种也是最消耗资源,消耗时间的!
第二种方式:加减法
nTemp1 = nTemp1+ nTemp2;
nTemp2 = nTemp1 - nTemp2;
nTemp1 = nTemp1 - nTemp2;
该种方式能完成一些数据的交换,因为这种方式用到 + 运算,所以不得不考虑溢出情况!
第三种方式:乘除法
nTemp1 = nTemp1 * nTemp2;
nTemp2 = nTemp1 / nTemp2;
nTemp1 = nTemp1 / nTemp2;
该种方式能完成一些数据的交换,这种方式只能运用到整数上!
第四种方式:抑或
nTemp1= (nTemp1^ nTemp2);
nTemp2= (nTemp2 ^ nTemp1);
nTemp1= (nTemp1^ nTemp2);
该种方式完全没有用缓冲变量及二进制的运算,从而节约了资源和时间! 不知道为什么的,建议随便拿本书看看 ^ 的用法。
第五种方式:压栈
_asm
{
push nTemp1 ;
push nTemp2 ;
pop nTemp1 ;
pop nTemp2 ;
}
这里用到内联汇编,内联汇编中堆栈的“后进先出”的优势,使交换更容易!
第六种方式:xchg指令
_asm
{
mov eax, nTemp1 ;
xchg nTemp2, eax ;
mov nTemp1, eax ;
}
汇编中的xchg指令是交换两个操作数的位置,在vc++中内联汇编继续保留了xchg指令,所以我们依然可以用这个指令完成两个数值的交换!
交换两个数的数值方式就介绍完了,后面两种方式使用了汇编的解决方案。在我的机子测试过,第6种方式所需时间是最少的!至于那个 ^ 运算和内联汇编的使用不懂的,大家google吧,在此不在赘述了!
“从交换两个值”谈起
最新推荐文章于 2024-08-31 09:49:26 发布