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

转载 2015年04月16日 08:27:47

通常的交换两个变量a,b的过程为

int temp;

temp=a

a=b;

b=temp;

需借助上面的第3个临时变量temp.


采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:

1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0

2.任意一个变量X与0进行异或运算,结果不变,即X^0=X

3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)

4.异或运算具有可交换性,即a^b=b^a


分析:

第一步:    a = a ^ b;

完成后 a变量的结果为a ^ b


第二步:    b = a ^ b;

此时赋值号右边的a保存的是a ^ b的值,那么将赋值号右边的a用a ^ b替换,

得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,

即经过第二步运算后b中的值为a,即b=a,将a换到了b里


第三步:    a = a ^ b;

此时赋值号右边的a保存的仍然是a ^ b的值,不变,而赋值号右边的b已经是a 了,

将赋值号右边的a,b分别进行替换,

即此时赋值号右边a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 该值赋值给a,即a=b

即经过第三步运算后a中的值为b,即a=b,将b换到了a里

这样经过如上的三步骤,完成了交换两个变量a,b而无需借助第3个临时变量过程。

这个过程等价于如下的过程,:

a=a+b

b=a-b;

a=a-b;

前提是a+b的值不能溢出。

测试程序如下:

int main()
{
    int a = 4, b = 5;
    printf("a=%d b=%d\n", a, b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d b=%d\n", a, b);
}

运行结果:
[root@test cs]# ./a.out
a=4 b=5
a=5 b=4
[ 注意:当a和b相等时,该方法不适用]

--本文结束--

相关文章推荐

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

通常的交换两个变量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
  • 147

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

通常的交换两个变量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
  • 393

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

今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作。 原始代码: texture->imageD...

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

通常的交换两个变量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,通过对比异或,...

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

不用算术运算符实现两个数的加法(按位异或)   对于二进制的加法运算,若不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0,通过对比异或,不难发现,此方法与异或运算类似。因而排出进...

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

用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,在不考虑进位的基础上,如下 1 + 1 = 01 + 0 = 10 + 1 = ...
  • hnxijie
  • hnxijie
  • 2016年05月23日 15:53
  • 1116

异或运算及其应用-查找奇数个数的数字

异或运算功能很强大。用的得当可以提高算法效率。 先说一下异或运算的运算法则: 1. a ^ b = b ^ a   2. a ^ b ^ c = a ^ (b ^ c) = (...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异或运算实现两个数的交换
举报原因:
原因补充:

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