c++使用按位异或运算实现无需临时变量的整数值交换

  通常情况下,要实现两个变量值的交换,可以通过使用临时变量的函数模板来实现:

1 template <typename T>
2 void Swap(T &lhs, T &rhs)
3 {
4     T temp = lhs;
5     lhs = rhs;
6     rhs = temp;
7 }

  但对于整形变量来说,使用位运算的效率会更高:

1 void Swap(int &lhs, int &rhs)
2 {
3     lhs ^= rhs;
4     rhs ^= lhs;
5     lhs ^= rhs;
6 }

  上面的代码之所以能使用按位异或运算实现交换,是因为:

  第一步,a ^= b,此时b的值不变,a的值变为a^b。

  第二步,b ^= a,此时a的值仍为a^b,而b = a ^ b = a ^ b ^ b,由于一个值异或它本身等于0,所以b的值变为a,此时b已完成交换。

  第三步,a ^= b,此时a的值为a ^ b,b的值为a,所以a = a ^ b = a ^ b ^ a = b,a完成交换。至此,a、b完成值的互换。

  但是上述代码只能用于lhs与rhs指向不同对象的情况,当lhs与rhs指向同一个对象时:

1 int main()
2 {
3     int num = 1;
4     cout << "lhs = " << num << ", rhs = " << num << endl;
5     Swap(num, num);
6     cout << "lhs = " << num << ", rhs = " << num << endl;
7     system("pause");
8     return 0;
9 }

  结果如图:

  这是因为若两个引用参数都指向同一个对象,在第一步时a = a ^ b = 0,两个引用的值都变为0,自然也就无法得到正确的结果,解决方法是使用if语句判断:

1 void Swap(int &lhs, int &rhs)
2 {
3     if (lhs == rhs)
4     {
5         return;
6     }
7     lhs ^= rhs ^= lhs ^= rhs; //使用链式赋值
8 }

 

你可能感兴趣的:(c++使用按位异或运算实现无需临时变量的整数值交换)