两个数互换,不使用第三个空间

昨天在一个技术群中,一大堆人讨论“两个数交换,不使用第三个空间”这个问题。当时我给了个答案。
a = a + b;
b = a - b;
a = a - b;
不过后来发现有数据溢出的问题,比如函数void ChangeAB(int a, int b);如果a = int.MaxValue - 10, 30;(int.MaxValue = 2147483647)那么就会出现数据溢出的问题。虽然说最后两个数字是互换了,但是总觉得不好,后来我又给了个答案:
a = a ^ b;
b = a ^ b;
a = a ^ b;
结果一些群友没明白啥意思,当时我建议大家补习一下异或的知识。今天抽空,在这里给大家补充一下第二种方法的解释。在解释之前需要学习一下“^”是什么。“^”是异或的意思。如果学习过离散相信没人不知道“异或”吧。我们的计算机是2进制,就是“0”和“1”,那么01之间的异或关系就是下列样子:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
知道了异或关系,
a = a ^ b;
b = a ^ b;
a = a ^ b;
就十分好解释了。
我已10和15为例。比如调用void ChangeAB(int a, int b);的语句为:this.ChangeAB(10, 15);其处理步骤为:
1、将10和15转化成二进制
00000000000000000000000000001010
00000000000000000000000000001111(第32的0代表是正数)
2、下面我开始翻译
"a = a ^ b;"为:a = 00000000000000000000000000001010 ^ 00000000000000000000000000001111 = 00000000000000000000000000000101
"b = a ^ b;"为:b = 为:00000000000000000000000000000101 ^ 00000000000000000000000000001111 = 00000000000000000000000000001010
"a = a ^ b;"为:a = 为:00000000000000000000000000000101 ^ 00000000000000000000000000001010 = 00000000000000000000000000001111
所以输出时:a = 00000000000000000000000000001111 = 15,
b = 00000000000000000000000000001010 = 10。
此式子的优势是无需考虑正负问题,也无需考虑数据溢出问题。

posted on 2012-02-13 10:29  张隽永  阅读(422)  评论(2编辑  收藏  举报