您的位置:首页 > 其它

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

2012-02-07 15:54 232 查看
昨天在一个技术群中,一大堆人讨论“两个数交换,不使用第三个空间”这个问题。当时我给了个答案。

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。

此式子的优势是无需考虑正负问题,也无需考虑数据溢出问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: