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

简介

今天在写代码时,需要写一个两个数交换的函数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了。。。。。

总结

多读书多读书。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值