使用异或来交换数据只有缺点,没有优点!

家人们,我在刚开始学习到可以使用异或来交换数据的时候,我就潜意识的以为(或者是受身边影响)以为这个方法是最高效最好的,但是后来我就想到运算难道比赋值还快吗,结果恰恰相反,使用异或最多就是不用设置第三个变量,然而它却缺点重重;

交换数据常见的三种方法

第一种,创建第三个变量来交换数据,最原始的方法

int a;int b;
int tem = a;
a = b;
b = tem;

第二种,不创建第三个变量来交换数据,但是可能会导致数据溢出,使程序崩溃

int a;int b;
a = a+b;
b = a-b;
a = a-b;

第三种,也是不创建第三个变量来交换数据,解决了可能数据溢出的风险

int a; int b;
a ^= b;
b ^= a;
a ^= b;

首先讲第三个利用异或来交换数据,之前以为这种方法最好,效率最高

而实际上呢?我们来看看生成的汇编代码

第一种创建第三个变量赋值交换数据的方法

      movl        b, %eax    ;将b从内存载入到寄存器eaxmovl        a, %edx    ;将a从内存载入到寄存器edxmovl        %eax, a    ;将eax的内容存入到内存a中xorl        %eax, %eax ;将eax清零movl        %edx, b    ;将edx的内容存入到内存b中

第三种异或运算交换数据的方法;
这个方法在-O2和-O3翻译成汇编:

movl        b, %eax       ;将b从内存载入寄存器eax
movl        a, %ecx       ;将a从内存载入寄存器ecx
movl        %eax, %edx    ;将eax的值保存到edx中
xorl        %ecx, %edx    ;ecx与edx异或
xorl        %edx, %eax    ;edx与eax异或
xorl        %eax, %edx    ;eax与edx异或
movl        %eax, b       ;将eax的值存入到内存b中
xorl        %eax, %eax    ;将eax置0:设置返回值,与上例中一样
movl        %edx, a       ;将edx的值存入到内存a中

原文链接:https://blog.csdn.net/major_zhang/article/details/78616913

以上说明了,异或运算比赋值效率低了很多,并且还有一个缺点,异或运算不能交换float数据

还有一个问题异或运算自己的时候     a^=a;   a会变成0;

所以我觉得正常情况还是得返璞归真,用最原始的方法:创建第三个变量来交换数据是最优解

当然不正常的情况就是数据特别特别大的时候,使用异或可能会好点,当然一般数据是不会那么大

总得来说;以后还是使用第一种最笨的方法好了;使用异或交换数据了解就好了,因为可能面试官会问

使用异或交换数据的优缺点相关推荐

  1. 位操作的应用:无参数交换数据,异或加密,循环移位加密【位操作】(56)

    有参数交换数据 无参数交换数据 异或加密(文本与二进制) key 为单个字符 key 为字符串 循环移位加密(文本与二进制) 有参数交换数据 #include <stdio.h>void ...

  2. arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...

    目录 土地报备坐标txt文件(坐标交换数据)转shp遇到的坑以及该功能的Python(ArcPy/ArcGIS)实现 一. 使用 Python(ArcPy) 绘制shp 什么是ArcPy 如何构造sh ...

  3. Java并发编程--6.Exchanger线程间交换数据

    在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中 在生产者-消费者情境模式中它包含了一个数缓冲区 ...

  4. 线程同步工具(七)在并发任务间交换数据

    声明:本文是< Java 7 Concurrency Cookbook >的第三章, 作者: Javier Fernández González 译者:郑玉婷 在并发任务间交换数据 Jav ...

  5. AJAX——与服务器交换数据并更新部分网页技术

    简介 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML) ...

  6. 利用proc 实现内核和用户态交换数据

    最近写程序需要内核得到用户态的参数,比较苦逼幸福的是虽然ioctrl 用不了,可以用proc实现,proc文件系统提供了一种内核和用户态交互的方法. proc文件系统的详细接口看<linux/p ...

  7. 工控设备 如何将数据发送到串口_AB PLC和西门子PLC之间需要交换数据

    场景:一个工控人,他接到一个项目,在微信群里交流起来,AB1769的PLC和西门子1500的PLC进行数据,让我帮他出个方案: 应用难点:通讯协议不同,处于不同IP段,PLC无源程序修改 方案:使用G ...

  8. 并发工具类(四)线程间的交换数据 Exchanger

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  9. 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据

    1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...

最新文章

  1. 2022-2028年中国女式西装行业研究及前瞻分析报告
  2. Django 布署6.5
  3. ORM单表查询,跨表查询,分组查询
  4. 【手写数据结构】双链表最详细图解
  5. System Center Technical Preview DPM(2016)对Exchange2016的灾难恢复
  6. python字符串索引位置替换 不搞虚的 直上代码
  7. img之间出现缝隙的原因_神马情况?美缝剂施工出现脱胶是什么原因?
  8. java写法可能存在的 java.lang.OutOfMemoryError: Java heap space 问题
  9. Ubuntu下安装wiznote
  10. ssm毕设项目鲲龙装饰公司在线管理系统的设计与开发前台模块iub6h(java+VUE+Mybatis+Maven+Mysql+sprnig)
  11. shell脚本case传递参数
  12. APP测试面试题汇总,面试必考一定要看
  13. NCTF Crypto WriteUp
  14. windows如何配置环境变量
  15. bzoj1616[Usaco2008 Mar]Cow Travelling游荡的奶牛*
  16. SDN(一) 用OpenWRT将路由器刷成openflow交换机
  17. JSP SSH机械设备台账管理系统myeclipse开发mysql数据库MVC模式java编程网页设计
  18. 直播需要加速吗?直播不用cdn加速的后果
  19. 3DMAX插件安装与详细说明
  20. led屏背后线路安装图解_专卖店室内全彩显示屏,室内全彩led屏安装

热门文章

  1. Thinkpad x13 锐龙安装 Archlinux 记录
  2. day5 谷粒学院 讲师数据加载不出来bug
  3. 13.【openCV_imread()函数详解】
  4. 深度学习-RNN注意力模型
  5. docker 安装 巡风--kali下安装
  6. 巡风安装配置 -windows
  7. 【操作系统⑥】——进程联系与临界区管理【同步与互斥 Dekker算法 TS指令 SWAP指令】
  8. Kicad 常用插件安装和使用
  9. 2019年支付宝优惠:免费或0.6元可购一张电子公交5折月卡
  10. SQL sever教程(实验2)数据库的查询和视图+SQL查询语句(一)