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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    php中字符与字节的区别
    sql把两值之和当作条件进行查询
    Intel® Neural Compute Stick 2
    使用OpenCV的VideoCapture 读取.mp4文件时出现以下错误:Unable to stop the stream: Inappropriate ioctl for device
    更换Raspbian Buster源
    OpenCV之cv2函数 2
    OpenCV中cv2的用法
    OpenVINO 对象识别 real_time_object_detection Movidius
    树莓派和计算棒实现图形识别 RaspBerry Pi4 with OpenVino and Movidius
    树莓派无线网卡老是掉线
  • 原文地址:https://www.cnblogs.com/graphics/p/1555188.html
Copyright © 2011-2022 走看看