今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作。
原始代码:
写了一段代码测试了一下:
运行结果:
^ 在 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优化的。
但是我写了一个程序测试了一下,异或操作方法好像还要慢一些。
普通方法:
异或方法:
个人感觉还是用普通的方法好点。路过的给点建议哈~~
分享到:
相关推荐
用于计算十六进制的异或运算,内含源文件以及执行文件
利用C++语言设计BP神经网络来解决非线性的异或问题
这是C++ API封装的 串口通讯类,因为只负责发送,所以没有封装接受函数,校验类型,因为只有8个字节,异或校验。校验可以自己重写
交换两个数的值,通常用利用一个变量来交换数值,异或交换两个数的值是资源开销最小的方法,不需要中介数,原理简单的来说就是异或的负负得正
不要采用异或来交换两个变量。
这个程序主要的实现用异或加解密,与普通的程序不同的是:只需要输入要加解密的文件名和密码即可,不需要输入操作后的文件名。程序首先会随机生成一个临时文件(文件名随机),将操作后的数据存在临时文件里,然后...
实现字符串数据的异或,字符串为8倍数长度,不足为补足0
本文详细叙述了C/C++的位操作,这是C/C++程序设计中非常重要的概念。本文实例对于C/C++初学者来说也具有很好的复习与参考价值。具体分析如下: C/C++对位操作有如下方法: 一、位操作运算符(注意:下面几个运算符不...
用C/C++语言实现计算机内部,运算器基本算术运算和逻辑运算,包括:原码一位乘法、补码一位乘法(Booth)、原码加减交替除法、补码加减交替除法、逻辑左右移位、逻辑与、逻辑或、逻辑非、逻辑异或。由控制器从ins_...
该工具集合了串口收发,多字符串发送、HID、TCP、DES/MAC、AES、SM4、HASH/MD5/CRC/XOR/异或和、累加和等功能
最近在工作中遇到了两个值交换的需求,发现自己对异或有些忘记,所以索性写出来,方便以后需要的时候参考学习,下面这篇文章主要给大家介绍了关于C语言如何利用异或进行两个值的交换的相关资料,需要的朋友可以参考...
crc 异或校验 c语言 方便移植
1、本文详细描述了C++语言异或运算的使用方法。 2、通过详细示例,让读者更直观地阅读,更清晰的理解。 3、示例代码可直接复制,编译后可直接运行。 4、根据示例以及运行结果,让读者加强记忆及理解。
* 方法一:实现两个数交换 **/ public class Exchange1 { public static void main(String[] args) { /** * 随机生成两个固定序列的0-100之间的整数, * 其中101表示生成的数范围区间在:[0-101) */ Random ...
陈硕 (giantchen_AT_gmail)
使用异或位运算实现加密解密比aes算法更快,但安全性有待思考。为什么基本上使用md5对用户密码加密?因为md5算法是不可逆的:对加密结果不能进行解密。任意长度的数据,算出的md5值长度都是固定的。部分参考uikoo9...
神经网络实现异或问题,采用的是2:2:1的结构,并采用sigmoid函数
这是使用异或实现的简单的文件的加解密,另外还有一个我的资源实现加解密的在这里:https://download.csdn.net/download/lxiao428/10802653
可以在训练后得到稳定权值,进行异或运算,训练的次数在2000左右,用c语言实现。