【C/C++】异或操作巧妙实现两个数的交换操作
今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作。
原始代码:
texture->imageData[cswap] ^= texture->imageData[cswap+2] ^=
texture->imageData[cswap] ^= texture->imageData[cswap+2];
写了一段代码测试了一下:
#include <iostream>using namespace std;int main()
{int a = 1;int b = 2;a ^= b ^= a ^= b;cout << "a = " <<a << endl;cout << "b = " <<b << endl;
}
运行结果:
^ 在 C 里面是按位异或操作符,相同的话异或的结果就是 0,不同的话就是 1。
其实用笔推一下就知道了。
首先,运算顺序是从右往左的。
假设a、b原始值记为a0,b0.
最右边的^=运算之后:
b不变。b = b0.
a = a0 ^ b0;
倒数第二个^=运算之后:
a不变。a = a0 ^ b0;
b = b0 ^ a = b0 ^ (a0 ^ b0) = b0 ^ (b0 ^ a0) = a0;
最前面的^=运算之后:
b不变。b= a0;
a = a ^ b = (a0 ^ b0) ^ a0 = b0.
这样就实现了a和b两个数的交换操作。
说实话,第一次见到这样的语句时,确实很费解。诚然,这样的操作相比声明一个临时变量,节省空间。但是感觉代码的可读性并不是很好。
我看到原始代码这条语句上还有一个注释,说是XX优化的。
但是我写了一个程序测试了一下,异或操作方法好像还要慢一些。
#include <iostream>
#include <time.h>
#include <windows.h>using namespace std;int main()
{int a = 1;int b = 2;int temp = 0;DWORD time1 = GetTickCount();cout << "time1 = " << time1 << endl;for (int i = 0;i < 100000000;++i){//a ^= b ^= a ^= b;temp = a;a = b;b = temp;}DWORD time2 = GetTickCount();cout << "time2 = " << time2 << endl;cout << time2 - time1 << endl;
}
普通方法:
异或方法:
个人感觉还是用普通的方法好点。路过的给点建议哈~~
【C/C++】异或操作巧妙实现两个数的交换操作相关推荐
- 常用技巧 —— 位运算 —— 异或运算实现两个数的交换
[概述] 交换变量时,通常是借助一临时变量来赋值实现 void exchange(int a,int b) {int temp;temp=a;a=b;b=temp; } 当采用异或运算时,实现两变量交 ...
- c语言异或实现交换原理,使用异或运算符实现两个数交换原理
使用异或运算符实现两个数交换原理 子不语 • 2019 年 12 月 21 日 使用异或运算符实现两个数交换原理 可以使用异或运算符实现两个数交换#include using namespace st ...
- 实现两个数的交换(异或,加减)
1. 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;} 2.还可以通过异或来实现两 ...
- C语言利用异或操作对数据进行加密和解密操作
C语言利用异或操作对数据进行加密和解密操作 C语言异或加密实现的原理为,将任意值,与相同值两次异或后,结果与原值相同.所以可以通过将源数据与一个固定的值(秘钥key)异或后,得到密文,然后将密文再次与 ...
- 用指针和函数的方法完成两个数的交换
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容6]用指针和函数的方法完成两个数的交换 传递规则:主函数 ...
- 【c语言】输入两个数,交换这两个数后,再输出
<程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容3] 编程实现:输入两个数,交换这两个 ...
- 指针,指针:分装一个函数,实现两个数的交换。 指向固定的区域
1.指针的引入 //第9行,取值运算符*,他把后面跟的内存地址中的数据"取出来": 2.指针变量的引入 什么是指针变量:存放地址的变量 什么是指针变量:存放指针的变量 指针 = 地 ...
- (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换
(1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换 import math a = float(input('请输入直角三角形直角边a的长度:')) ...
- 实现两个数交换python_编写一个程序,用于实现两个数的交换。_学小易找答案
[判断题]定喘穴定位在胸部 (10.0分) [其它]实现实心等腰三角形图案打印输出. [其它]编写一个程序,用于实现两个数的交换. [其它]实现空心等腰三角形图案打印输出. [判断题]表寒肺热证的代表 ...
最新文章
- python使用符号#表示单行注释-【经济金融及Python应用讲义】Python编程规范之注释...
- JavaWeb第一讲 Servlet的工作原理及生命周期
- 在jOOQ之上构建的RESTful JDBC HTTP服务器
- 华科02年计算机考研复试机试
- 表格中建一个按钮_CAD | CAD和Excel的表格互换教程
- 【Elasticsearch】Elasticsearch ICU现在可以理解表情符号了!
- Android地图权限处理,Android 使用地图时的权限请求方法
- java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?
- Newton Raphson算法
- Linux内核4.14版本——mmc框架——mmc硬件总线扫描流程(以sd card为例)
- 【项目总结】ACM Recsys2019
- 2022年4月份京东有什么活动?
- c语言程序仪表称重编程,液体原料自动称重配料系统(软件设计)本科毕业设计(论文).doc...
- [Python图像识别] 四十七.Keras深度学习构建CNN识别阿拉伯手写文字图像
- 银行制定快捷支付限额原因
- 2015062001 - 诸葛亮
- bzoj3083 遥远的国度 bzoj3626 LCA (树链剖分)
- 纯前端实行—简单的用户信息记录界面
- 数据集成平台的特点(Oracle service bus)
- 股票查询小程序_以龙虎榜数据为例
热门文章
- ubuntu 20.04 下安装使用clash for windows
- PyCharm的structure自动定位到相应的函数位置
- leadshop商城系统源码-前后端代码开源-v1.0.0
- mysql rr和rc_MySQL Transaction--RC和RR区别
- unix查询内存使用率_Elasticsearch高级调优方法论之——根治慢查询
- FacetWP 筛选与多条件搜索 WordPress插件
- CYP音乐emlog主题免费版 炫酷黑色主题
- linux host命令超时,Linux中的PING命令。每日一个小知识。不怕学不会
- mysql连接代码_MySQL 表连接
- 苹果cms快鸭影视海螺精品模板