对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。

异或运算可以达到交换两数的目的,代码如下:

void swap(int &a, int &b)
{a = a^b;b = a^b;a = a^b;
}

但不推荐使用这种方式,附上常用的临时变量方法对比说明。

临时变量方法:

void swap(int &a, int &b)
{int tmp = a;a = b;b = tmp;
}

对于临时变量法,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作;但是对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。另外一点,异或操作的代码可读性差。

如果使用C语言实现上述两种方法,并用gcc编译器编译,可以使用命令 gcc -S swap.c 查看相应的汇编代码,临时变量法代码行数更少,另外使用 gcc 编译器时,用异或运算交换数组会出错,参见链接。

在不引入临时变量的基础上,交换两数的值还可以使用三次加减法,代码如下:

void swap(int &a, int &b)
{a = a + b;b = a - b;a = a - b;
}

这种方式同样需要三次内存写入操作,同时代码可读性也较差。

最后附上两张三种方法编译后对应汇编代码对比图(平台:Ubuntu14.04,gcc 4.8.4),图中 swap1.c 文件对应临时变量法,swap2.c 文件对应加减方法,swap3.c 文件对应异或方法。可以看到,临时变量法编译出的汇编代码量最少即效率更高,加减法和异或方法的区别仅仅是计算方式不同而已,操作步骤是一致的。

图1: 临时变量法和加减法汇编代码对比,点击图片查看大图。

图2: 异或方法和加减法汇编代码对比,点击图片查看大图。

C 关于使用异或运算操作概述相关推荐

  1. FEC之异或运算应用

    话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a ...

  2. c语言位运算_C语言自增减、逻辑运算、位运算、位移运算及三目运算操作

    你崩溃到凌晨,她和他睡到自然醒... ----  网页云热评 一.自增自减操作 #include int main() { int val = 0, val1 = 0; ++val; //前操作 pr ...

  3. 左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算

    我们常说,程序=算法+数据结构.结果光搞框架去了,有点说不过去~ 时间复杂度 常数时间的操作:如果一个操作的执行时间不以具体样本为转移,每次执行时间都是固定时间.称这样的操作为常数时间操作. 数组的寻 ...

  4. python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

    问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...

  5. 异或运算交换两个整数

    异或运算有两个特性: 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. 基于此,交换操作如下: a=a^b; b=b^a; a=b^a;

  6. 使用异或运算交换两个任意类型变量

    这篇文章中将使用C语言,实现交换两个任意类型变量的功能.说到任意类型用C让人感觉很难做,如果是C++则使用模板函数就轻松搞定: template<class T> inline void ...

  7. [转载] 用Java语言实现对十六进制字符串异或运算

    参考链接: 交换两个字符串,而无需在Java中使用第三个用户定义的变量 前言:好久没有写博客,最近一年感觉真是好忙,各种做不完的工作.相信很多上班族都会有这种感觉.最近对NFC进行写卡操作,需要计算一 ...

  8. 常用技巧 —— 位运算 —— 异或运算实现两个数的交换

    [概述] 交换变量时,通常是借助一临时变量来赋值实现 void exchange(int a,int b) {int temp;temp=a;a=b;b=temp; } 当采用异或运算时,实现两变量交 ...

  9. 选择排序、冒泡排序、异或运算

    选择排序 数组取数时间复杂度是常数 int a= arr[i] 从数组中获取第i位置的数即获取某个偏移量或距离的数 时间复杂度是一个常数 数组在内存中的地址空间是连续的 所以通过偏移量就可以获取到指定 ...

最新文章

  1. C++ STL: 分配器allocators 源码分析
  2. Java IO 4 : RandomAccessFile
  3. Kotlin代码检查在美团的探索与实践
  4. 网络协议 8 - TCP协议(上):性恶就要套路深
  5. 怎样从red hat linux图形登录改成从文本登录
  6. ios笔试题算法_微软笔试题-Dijkstra算法
  7. ViewPager切换滑动速度修改
  8. 关于现代计算机的知识,从资本经济到知识经济:现代计算机的知识革命
  9. http状态码大全整理
  10. Spark安装部署:Standalone模式
  11. Godot Label 节点
  12. html5 颜色对应8进制,十进制字体颜色html代码参照表 rgb值颜色查询对照表
  13. NOIP2017提高组题解(待填坑)
  14. ​杭州阿里、海康、网易等组成 HR 联盟,以后你还敢跳槽吗?
  15. 回眸 2021,展望 2022
  16. 禁用迅雷极速版自动升级为迅雷x
  17. 宝兰德BES安装及Springboot项目打包部署及websocket解决方案
  18. tcl文件调用c语言,TCL与c/c++的互相调用
  19. 函数模板和类模板的区别
  20. 笔记本F1音量键常亮,电脑没声音?这里有妙招。

热门文章

  1. 我是怎么读源码的,授之以渔
  2. 我是村里唯一的PM,哈哈哈…
  3. 为什么工厂模式可以解耦?(一)
  4. pandas数据清洗(缺失值、异常值和重复值处理)
  5. 根据字符出现频率排序
  6. MATLAB_8-边缘检测_demo.m[课堂齿轮作业]其他的在文章末尾
  7. 白平衡——图像处理中的一种增强技术
  8. 【项目实践】从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附注释项目代码)...
  9. 新手必会的 9 个 Python 技巧!
  10. centos上安装anaconda并配置虚拟环境