为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
2014-03-04 10:10
465 查看
通常的交换两个变量a,b的过程为
int temp;
temp=a
a=b;
b=temp;
[b]需借助上面的第3个临时变量temp.[/b]
采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:
a = a ^ b;
b = a ^ b;
a = a ^ b;
这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于[b]异或运算的如下性质:[/b]
1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0
[b]2.任意一个变量X与0进行异或运算,结果不变,即X^0=X[/b]
[b]3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)[/b]
[b]4.异或运算具有可交换性,即a^b=b^a[/b]
分析:
第一步: 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]将b换到了a里
[/b]
这样经过如上的三步骤,完成了交换两个变量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相等时,该方法不适用]
--本文结束--
int temp;
temp=a
a=b;
b=temp;
[b]需借助上面的第3个临时变量temp.[/b]
采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:
a = a ^ b;
b = a ^ b;
a = a ^ b;
这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于[b]异或运算的如下性质:[/b]
1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0
[b]2.任意一个变量X与0进行异或运算,结果不变,即X^0=X[/b]
[b]3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)[/b]
[b]4.异或运算具有可交换性,即a^b=b^a[/b]
分析:
第一步: 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]将b换到了a里
[/b]
这样经过如上的三步骤,完成了交换两个变量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相等时,该方法不适用]
--本文结束--
相关文章推荐
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 通过异或运算实现两个变量的交换(不需借助第三个变量)
- 在不借助第三方变量情况下实现两个变量的交换(借助于异或运算)
- 交换两个整数类型的变量(不借助第3个变量)
- 使用异或运算 不借助临时变量交换两个数
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- java中把两个变量进行值交换,通过异或两次运算就能实现值互换。
- Java中异或运算实现两个整数的交换以及其功能函数实现
- 不借助第3个变量,实现两个整型变量的交换
- 按位异或,实现不借助临时变量的两数交换
- 通过位运算实现两个整数加、减、乘、除以及两个变量的交换
- 异或运算实现两个整数的交换
- (1.1.2)C的|、||、&、&&、异或、~、!运算 (交换两个值,不用临时变量)
- 交换两个数的内容(交换两个变量的内容,编程实现。(如果不允许创建临时变量呢?))
- 通过异或运算交换两个整数的值
- Java--交换两个变量的值的三种方法:借助中间量交换,数值相加减交换,位移运算交换
- Java实现两个变量值互换-----不借助第3个变量
- 不使用临时变量交换两个变量的值(异或,加减,乘除)
- 关于交换两个整数(不借助第三个临时数)...
- 变量交换 如果要把两个整型变量a、b的值交换,一般要采用一个中间变量做过渡, 但也可以在不借助任何其它变量的情况下完成。