为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
来源:互联网 发布:苹果刷机软件 编辑:程序博客网 时间:2024/04/28 22:29
通常的交换两个变量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相等时,该方法不适用]
--本文结束--
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 交换两个整数类型的变量(不借助第3个变量)
- 使用异或运算 不借助临时变量交换两个数
- 在不借助第三方变量情况下实现两个变量的交换(借助于异或运算)
- 不借助第三个变量交换两个整数的值
- 不借助第三个变量,进行两个整数的交换
- 不借助第三个变量实现两个变量的交换
- 异或运算实现两个整数的交换
- 不借助第三个变量实现两个数的交换
- Java基础应用之运算符(实现两个变量的互换(借助第3个变量))
- Java基础应用之运算符(实现两个变量的互换(不借助第3个变量))
- 无需第三个变量实现两个数的交换
- 不借助临时变量交换两个变量的值
- (1.1.2)C的|、||、&、&&、异或、~、!运算 (交换两个值,不用临时变量)
- 两个数值的交换(无需借助第三个参数)
- 不借助第三个变量交换两个整数
- 不借助第三个变量交换两个整数
- 问答——为什么就算配置很高的 Android 手机玩游戏感觉画面也没有 iPhone 流畅,而且触屏感觉比较迟钝?
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- win7系统下vs2005无法调试web项目
- linux下安装mysql
- 毕业后就是程序员——我的阿里、金山、中华、腾讯、360、网易面试总结
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
- 鼠标指针定位
- 毕业后就是程序员——我的阿里、金山、中华、腾讯、360、网易面试总结(二)
- vmstat&Linux Shell 内存监控
- 毕业后就是程序员——我的阿里、金山、中华、腾讯、360、网易面试总结(三)
- 只有i帧的pts,dts,如何求取中间的b帧和p帧的长度和解码时间
- poj2029
- VC tab control 使用简单例子
- 生成头像(没事写着玩的)