【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;
}
普通方法:

异或方法:



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


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

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方...
  • heathyhuhu
  • heathyhuhu
  • 2013年10月15日 08:32
  • 13342

用异或来交换两个变量是错误的

用异或来交换变量是错误的 陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice 翻转一个字符串,例如把 "12345" 变成 "54321",这是一个最简单的不过...
  • Solstice
  • Solstice
  • 2010年01月09日 22:43
  • 32035

用异或进行两个数交换的陷阱

我们都知道可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;  ...
  • u010141928
  • u010141928
  • 2017年07月26日 12:51
  • 145

关于通过异或交换两个元素的值的一个陷阱

#include #include using namespace std; void swap(int *a,int *b){ *a = *a ^ *b; *b = *a ^ *b;//将...
  • qq792326645
  • qq792326645
  • 2015年08月17日 12:43
  • 616

C语言实现交换两个数

C语言中要实现交换两个变量的值可以有很多种方法,下面是我收集的方法:方法一:使用临时变量void exchange(int *a, int *b){ int temp = 0; temp ...
  • flyingstarwb
  • flyingstarwb
  • 2009年06月24日 22:18
  • 14244

异或操作实现两数值交换和其中的bug

· 异或操作           在进行两个数值交换的时候一般有两个选择: 1) 中间变量 ;  2) 坐标系 。除此之外,还可以使用异或操作         异或操作的原理是将两个数由十进制...
  • qq869348527
  • qq869348527
  • 2016年08月10日 15:53
  • 644

如何实现两个数交换的交换以及宏定义的编写

【语句实现方法】 方法1:不使用中间变量 ●利用位运算符  a = a^b; b = a^b; a = a^b;  →    a^= b^ = a^ = b;(不用考虑越界问题) 【解释】: ...
  • u012512762
  • u012512762
  • 2014年10月16日 12:18
  • 2026

C++中实现的交换两个数的值

#include void swap1(int a,int b) { int temp; temp=a; a=b; b=temp; } void swap(int *a ,int *b) {...
  • a1037488611
  • a1037488611
  • 2014年11月14日 15:30
  • 3650

两个数间的交换(按位操作不用中间变量temp即可实现两个数据的交换)C++按位与运算交换数据vs2013环境

两个数间的交换(按位操作)C++按位与运算交换数据vs2013环境 不用中间变量temp即可实现两个数据的交换 #include using namespace std; void swap(i...
  • Liuchuang_MFC
  • Liuchuang_MFC
  • 2015年10月30日 11:32
  • 619

【C语言学】写一个俩个数交换的宏定义

第一种: //直接法 #define SWAP(a, b) { a = a ^ b, b = a ^ b, a = a ^ b } 可如果是浮点运算怎么办? 第二种: //加入类型声...
  • KISS_BEN
  • KISS_BEN
  • 2012年11月04日 23:14
  • 4255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C/C++】异或操作巧妙实现两个数的交换操作
举报原因:
原因补充:

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