如何不使用新变量进行两数互换

在学C++过程有一章节看到了一个内容:不使用第三变量就可以实现两数互换

当时我很疑惑是怎么做到的。看到了它用到了异或运算符 ^ 

于是百度了下 看到了这位老哥的文章https://blog.csdn.net/zxm1306192988/article/details/50446399#commentsedit

自己尝试了下发现真的互换了

#include <iostream>
using namespace std;

int main()
{
	int a = 10, b = 15;
	a ^= b ^= a ^= b;
	cout << a << endl << b << endl;
	system("pause");
	return 0;
}

我就想为什么可以这样做,其实上面那篇博客已经有它的原理,不过可能还有人不清楚,我就来说说我的理解

比如:二进制数 1011 和 0101 ,它们进行异或的结果是 1110

结果保存了 这两个二进制数各自的位和对方的位是一样还是不一样(我叫作状态,1就是不一样,0就是一样)

比如说(按左到右的顺序):

    1和0比较,这两位不一样,结果保存状态1(代表它们是不相同的)

    0和1比较,这两位不一样,结果保存状态1(代表它们是不相同的)

    1和0比较,这两位不一样,结果保存状态1(代表它们是不相同的)

    1和1比较,这两位一样  , 结果保存状态0(代表它们是相同的)

然后我用1011和结果1110(状态保存)相异或(按左到右)

(其实这个时候是看结果(状态保存)是1还是0然后决定原来的二进制数取什么值)

    1和1比较,(后面的1表示原本两个二进制数是不相同的)前面的1就要取反,结果为0

    0和1比较,(后面的1表示原本两个二进制数是不相同的)前面的0就要取反,结果为1

    1和1比较,(后面的1表示原本两个二进制数是不相同的)前面的1就要取反,结果为0

    1和0比较,(后面的0表示原本两个二进制数是相同的)前面的1就不变,       结果为1

于是1011(原来的二进制数)和1110(结果)相异或的结果是0101(原来的二进制数)就得到了原来的另一个二进制数。

点赞