【C/C++】异或操作巧妙实现两个数的交换操作

原创 2012年06月08日 19:48:50

今天在看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;
}
普通方法:

异或方法:



个人感觉还是用普通的方法好点。路过的给点建议哈~~


相关文章推荐

百度面试题之找出数组中之出现一次的两个数(异或的巧妙应用)

// 百度面试题 //数组中除两个数字外,其它数字都出现了次。要求尽可能快的找出这两个数字 #include using namespace std; void FindTwoN...

c/c++位操作简介--移位、位与、位或、异或

首先,计算机内部是以补码形式表示(参见:http://www.cnblogs.com/tenghoo/archive/2008/06/01/1211663.html)的,而且c移位操作采取补0还是补符...

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...
  • ztk329
  • ztk329
  • 2014年11月16日 18:21
  • 146

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面...

java异或运算交换两个数的陷阱

我们知道,用异或运算可以不用定义中间变量就可以交换两个数。如下: int a=2; int b=3; System.out.println("交换前:a="+a+" b="+b); a...
  • Mr__mao
  • Mr__mao
  • 2015年08月12日 20:43
  • 389

异或的运用 交换两个数的值

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...

不用算术运算符实现两个数的加法(按位异或)

http://www.cnblogs.com/houjun/p/4908725.html 对于二进制的加法运算,若不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0,通过对比异或,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C/C++】异或操作巧妙实现两个数的交换操作
举报原因:
原因补充:

(最多只允许输入30个字)