关于使用异或运算来实现两个数交换的问题

你说的曾经没有我的故事 提交于 2020-02-29 12:07:27

简介
今天在写代码时,需要写一个两个数交换的函数Swap(),于是想装个B,用位运算异或来实现,代码如下:

void Swap(int &a, int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

结果当传入的值是同一个变量时,出现了个尴尬的现象,就是值都变成了0。。。

我们知道异或运算是当都是1或0时,返回0,一个是1一个是0时,返回1,即

1^1 = 0
0^0 = 0
1^0 = 1
1101 0010 ^ 1011 0111 = 0110 0101

自己同自己异或为0

1010 1010 ^ 1010 1010 = 0000 0000

根据这个规则,可以很容易的实现两个数的交换运算,即:

int a = 4;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
cout << a << " " << b << endl;
//输出应该是5 4

按照这个思路,写了开头的Swap()函数,结果犯了一个特别要命的错误,就是当传入的值是同一个时,进行两两交换,按理来说,其值是不变的,例:

int a = 4;
int b = a;
Swap(a, b);
//a,b的值都是4

可是我用引用进行参数传递,刚刚说过,相同的数进行异或会为0,而引用,,,你知道的,他就是个别名,没有自己的内存,也就是只要其地址的内容变了,他就变了,所以当上面的代码a,b都是同一个变量c的引用时,相当于是执行了

int c = 4
Swap(c, c);
//c的值当然就是0了
为了能让Swap()这个功能函数完成所有的情况,需要再进行一次判断,看是否是同一个地址,即:

void Swap(int &a, int &b)
{
    if(&a == &b)return;
    a = a^b;
    b = a^b;
    a = a^b;
}

这样就OK了。。。。。
————————————————
版权声明:本文为CSDN博主「蚂蚁的希望」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36784975/article/details/88948013

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!