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