zoukankan      html  css  js  c++  java
  • 也谈交换两个变量


    不使用第三个变量交换两个变量的值,老生常谈了
    常见的两种方法
    int a = 1;
    int b = 2;
     1 int a = 1;
     2 int b = 2;
     3 
     4 方法一:加减法
     5 = a + b;
     6 = a - b;
     7 = a - b;
     8 
     9 方法二:异或操作
    10 = a ^ b;
    11 = a ^ b;
    12 = a ^ b;
    13 
    方法三:乘除法
    a = a * b ;
    b = a / b ;
    a = a / b ;

    最近在园子里看到下面的方法
    1 = b + (b = a) * 0;
    乍一看,真不敢相信是真的,上机一试还真行,但仅限于C#,在C++下面是不行的
    看一下反汇编后的代码就一目了然了
    C#反汇编代码
    Code

    C++反汇编代码:
    Code
    可见二者的区别就是,C#在求值过程中保存了b的值,而C++没有
    总结:
    此题的本质就是求一种操作X,要保证X是可逆操作,设其逆操作为Y, 也即,若 p X q = r 成立,那么一定有 r Y q = p 成立
    那么首先令
    a = a X b;
    这样a保存了a和b进行X操作后的结果
    然后再
    b = a Y b
    因为此时a = a X b, 又因为Y是X的逆操作,所以此时 b = a
    最后再
    a = a Y b
    此时a = a X b, 但是 b = a,所以 a = b

    纵观上面几种方法,它们的操作都是可逆的
    加法 <-> 减法
    乘法 <-> 除法
    异或 <-> 异或 (异或操作的逆操作是它本身)

    作者:zdd
    出处:http://www.cnblogs.com/graphics/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    【SpringBoot】 理解SpringBoot的启动原理
    【SpringBoot】SpringBoot的基础,全面理解bean的生命周期
    【转】 Linux 命令解释(Linux基础二)
    【转】 Linux 的目录详解 (Linux基础一)
    【SpringBoot】 一种解决接口返回慢的方式
    【Jmeter基础】 Linux上运行Jmeter
    【SpingBoot】 测试如何使用SpringBoot搭建一个简单后台1
    单例模式@Singleton在测试中的运用
    性能测试基础 ---TCP通信过程的状态码与过程,以及出现错误码的分析(TIME_WAIT,CLOSE_WAIT)
    Spring5源码分析(007)——IoC篇之加载BeanDefinition总览
  • 原文地址:https://www.cnblogs.com/graphics/p/1555188.html
Copyright © 2011-2022 走看看