通过异或位交换两个整型变量的一个不容易注意的细节

设变量 a = 1, b = 2, 我们要交换两个变量的值, 当用异或交换两个值的时候会有一个小问题

用位运算大概是这个样子的

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 void swap(int& a, int &b) {
 6     a ^= b;
 7     b ^= a;
 8     a ^= b;
 9 }
10 
11 int main() {
12     int a = 2, b = 3;
13     cout << "before swap a = " << a << " b = " << b << endl;
14     swap(a, b);
15     cout << "after swap a = " << a << " b = " << b << endl;
16     return 0;
17 }

能够正确交换两个变量的值, 但是我们有时候往往交换的是数组中的两个值, a[i] 和 a[j]

当i ==j的时候调用就会出错, 因为两个参数对应同一个引用, 而一个数和自己异或是0, 则a[i]就被赋值为0了, 其它的信息就找不会来了, 就出现了错误!

改正的办法还得加一个中间变量:

1 void swap(int& a, int &b) {
2     int c = a ^ b;
3     b = c ^ b;
4     a = c ^ a;
5 }

那这样就不如直接拿中间变量赋值了, 不用做异或了

 

posted @ 2015-09-24 00:35  ACSeed  Views(427)  Comments(0)    收藏  举报