【C/C++】异或操作巧妙实现两个数的交换操作
2012-06-08 19:48
387 查看
今天在看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优化的。
但是我写了一个程序测试了一下,异或操作方法好像还要慢一些。
异或方法:
个人感觉还是用普通的方法好点。路过的给点建议哈~~
原始代码:
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++】怎样不用中间变量temp 实现两个数交换
- 异或实现交换两个数
- 实现pow(int x, int y),即x的y次方 ; 异或交换两个数;
- 异或运算实现两个数的交换
- c++实现两个数的交换
- 用异或操作实现的交换函数用以实现数组逆置中需要注意的问题
- 异或运算实现两个数的交换
- 异或运算实现两个数的交换
- 【C++】怎样不用中间变量temp 实现两个数交换
- 转:用异或实现两个数的交换的问题
- C/C++/Java不使用临时变量实现两个数的交换
- 【异或交换原理】按位进行异或操作,实现数的交换
- 巧妙使用位运算实现两个数的交换(仅限使用于整数)
- 异或运算实现两个数的交换
- 异或运算实现两个数的交换
- 异或巧妙实现两变量交换
- 异或运算实现两个数的交换
- 异或实现两个数的交换