今天在看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++】异或操作巧妙实现两个数的交换操作相关推荐

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

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

  2. c语言异或实现交换原理,使用异或运算符实现两个数交换原理

    使用异或运算符实现两个数交换原理 子不语 • 2019 年 12 月 21 日 使用异或运算符实现两个数交换原理 可以使用异或运算符实现两个数交换#include using namespace st ...

  3. 实现两个数的交换(异或,加减)

    1. 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;} 2.还可以通过异或来实现两 ...

  4. C语言利用异或操作对数据进行加密和解密操作

    C语言利用异或操作对数据进行加密和解密操作 C语言异或加密实现的原理为,将任意值,与相同值两次异或后,结果与原值相同.所以可以通过将源数据与一个固定的值(秘钥key)异或后,得到密文,然后将密文再次与 ...

  5. 用指针和函数的方法完成两个数的交换

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容6]用指针和函数的方法完成两个数的交换 传递规则:主函数 ...

  6. 【c语言】输入两个数,交换这两个数后,再输出

    <程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容3] 编程实现:输入两个数,交换这两个 ...

  7. 指针,指针:分装一个函数,实现两个数的交换。 指向固定的区域

    1.指针的引入 //第9行,取值运算符*,他把后面跟的内存地址中的数据"取出来": 2.指针变量的引入 什么是指针变量:存放地址的变量 什么是指针变量:存放指针的变量 指针 = 地 ...

  8. (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换

    (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换 import math a = float(input('请输入直角三角形直角边a的长度:')) ...

  9. 实现两个数交换python_编写一个程序,用于实现两个数的交换。_学小易找答案

    [判断题]定喘穴定位在胸部 (10.0分) [其它]实现实心等腰三角形图案打印输出. [其它]编写一个程序,用于实现两个数的交换. [其它]实现空心等腰三角形图案打印输出. [判断题]表寒肺热证的代表 ...

最新文章

  1. python使用符号#表示单行注释-【经济金融及Python应用讲义】Python编程规范之注释...
  2. JavaWeb第一讲 Servlet的工作原理及生命周期
  3. 在jOOQ之上构建的RESTful JDBC HTTP服务器
  4. 华科02年计算机考研复试机试
  5. 表格中建一个按钮_CAD | CAD和Excel的表格互换教程
  6. 【Elasticsearch】Elasticsearch ICU现在可以理解表情符号了!
  7. Android地图权限处理,Android 使用地图时的权限请求方法
  8. java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?
  9. Newton Raphson算法
  10. Linux内核4.14版本——mmc框架——mmc硬件总线扫描流程(以sd card为例)
  11. 【项目总结】ACM Recsys2019
  12. 2022年4月份京东有什么活动?
  13. c语言程序仪表称重编程,液体原料自动称重配料系统(软件设计)本科毕业设计(论文).doc...
  14. [Python图像识别] 四十七.Keras深度学习构建CNN识别阿拉伯手写文字图像
  15. 银行制定快捷支付限额原因
  16. 2015062001 - 诸葛亮
  17. bzoj3083 遥远的国度 bzoj3626 LCA (树链剖分)
  18. 纯前端实行—简单的用户信息记录界面
  19. 数据集成平台的特点(Oracle service bus)
  20. 股票查询小程序_以龙虎榜数据为例

热门文章

  1. ubuntu 20.04 下安装使用clash for windows
  2. PyCharm的structure自动定位到相应的函数位置
  3. leadshop商城系统源码-前后端代码开源-v1.0.0
  4. mysql rr和rc_MySQL Transaction--RC和RR区别
  5. unix查询内存使用率_Elasticsearch高级调优方法论之——根治慢查询
  6. FacetWP 筛选与多条件搜索 WordPress插件
  7. CYP音乐emlog主题免费版 炫酷黑色主题
  8. linux host命令超时,Linux中的PING命令。每日一个小知识。不怕学不会
  9. mysql连接代码_MySQL 表连接
  10. 苹果cms快鸭影视海螺精品模板