C 关于使用异或运算操作概述
对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。 |
异或运算可以达到交换两数的目的,代码如下:
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 关于使用异或运算操作概述相关推荐
- FEC之异或运算应用
话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a ...
- c语言位运算_C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
你崩溃到凌晨,她和他睡到自然醒... ---- 网页云热评 一.自增自减操作 #include int main() { int val = 0, val1 = 0; ++val; //前操作 pr ...
- 左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算
我们常说,程序=算法+数据结构.结果光搞框架去了,有点说不过去~ 时间复杂度 常数时间的操作:如果一个操作的执行时间不以具体样本为转移,每次执行时间都是固定时间.称这样的操作为常数时间操作. 数组的寻 ...
- python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...
问题引入 在小强学Python+OpenCV之-1.4.2裁剪一节,我们使用的是numpy数组切片功能实现图片区域的裁剪. 那么,如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,使用掩 ...
- 异或运算交换两个整数
异或运算有两个特性: 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. 基于此,交换操作如下: a=a^b; b=b^a; a=b^a;
- 使用异或运算交换两个任意类型变量
这篇文章中将使用C语言,实现交换两个任意类型变量的功能.说到任意类型用C让人感觉很难做,如果是C++则使用模板函数就轻松搞定: template<class T> inline void ...
- [转载] 用Java语言实现对十六进制字符串异或运算
参考链接: 交换两个字符串,而无需在Java中使用第三个用户定义的变量 前言:好久没有写博客,最近一年感觉真是好忙,各种做不完的工作.相信很多上班族都会有这种感觉.最近对NFC进行写卡操作,需要计算一 ...
- 常用技巧 —— 位运算 —— 异或运算实现两个数的交换
[概述] 交换变量时,通常是借助一临时变量来赋值实现 void exchange(int a,int b) {int temp;temp=a;a=b;b=temp; } 当采用异或运算时,实现两变量交 ...
- 选择排序、冒泡排序、异或运算
选择排序 数组取数时间复杂度是常数 int a= arr[i] 从数组中获取第i位置的数即获取某个偏移量或距离的数 时间复杂度是一个常数 数组在内存中的地址空间是连续的 所以通过偏移量就可以获取到指定 ...
最新文章
- C++ STL: 分配器allocators 源码分析
- Java IO 4 : RandomAccessFile
- Kotlin代码检查在美团的探索与实践
- 网络协议 8 - TCP协议(上):性恶就要套路深
- 怎样从red hat linux图形登录改成从文本登录
- ios笔试题算法_微软笔试题-Dijkstra算法
- ViewPager切换滑动速度修改
- 关于现代计算机的知识,从资本经济到知识经济:现代计算机的知识革命
- http状态码大全整理
- Spark安装部署:Standalone模式
- Godot Label 节点
- html5 颜色对应8进制,十进制字体颜色html代码参照表 rgb值颜色查询对照表
- NOIP2017提高组题解(待填坑)
- ​杭州阿里、海康、网易等组成 HR 联盟,以后你还敢跳槽吗?
- 回眸 2021,展望 2022
- 禁用迅雷极速版自动升级为迅雷x
- 宝兰德BES安装及Springboot项目打包部署及websocket解决方案
- tcl文件调用c语言,TCL与c/c++的互相调用
- 函数模板和类模板的区别
- 笔记本F1音量键常亮,电脑没声音?这里有妙招。