在学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(原来的二进制数)就得到了原来的另一个二进制数。