博客统计信息

51cto推荐博客
用户名:realzjy
文章数:59
评论数:95
访问量:79930
无忧币:1242
博客积分:1952
博客等级:6
注册日期:2009-06-10

两个数互换,不使用第三个空间
2012-02-07 15:41:29
版权声明:原创作品,谢绝转载!否则将追究法律责任。
昨天在一个技术群中,一大堆人讨论“两个数交换,不使用第三个空间”这个问题。当时我给了个答案。
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。
此式子的优势是无需考虑正负问题,也无需考虑数据溢出问题。

本文出自 “张隽永” 博客,谢绝转载!

分享至
更多
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:我的情感技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
 

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: