“从交换两个值”谈起

交换两个值,这是任何一门语言书籍都会谈起的,今天我们还探讨这个看似简单,实则有点意思问题。我们用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吧,在此不在赘述了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值