码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-09-24 02:02:52      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

设变量 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 }

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

 

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

标签:

原文地址:http://www.cnblogs.com/ACSeed/p/4834014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!