异或 两数交换 (不用临时变量)

今天面试 碰到这样一道题目  :  两数交换 不用临时变量怎么解决 ?   让我们来分析一下 :


inta = 1;

intb = 2;


a = a + b;  
b = a - b;  
a = a - b;


这个思路很巧妙,但也存在一定问题: 万一溢出了怎么办?   


到目前为止,我们的答题思路是没错的,就是寻找另外一种数据存储的模式,
用 一个变量保存两条信息的集合,我们仍然需要采用这种模式解决这个问题,
但原先的简单相加的模式是不行了,于是我们想到,集合两个整型数字,是否
可以从其二进制表达方面来考虑?  


我们可以使用位异或来存储集合信息。 用 1 和 0 来做简单的验证,看是否
可以用异或的方式,存储信息的集合: 如果两个数是a = 1和b = 0,则:
 集合 = 1  0 异或 集合 = 1 1 异或 集合 = 0


 如果 a = 1 & b = 1
 集合 = 0  1 异或 集合 = 1 
 
 如果 a = 0 & b = 0 
 集合 = 0  0 疑惑 集合 = 0  
 

 验证结果: 可以采用信息集合的方式存储 那么我们的交换代码可以变成: 


 int a = 10;
 int b = 50;      
 
 a = a ^ b;  // 构建集合   
 b = a ^ b;  // 取出集合的另一个元素  

 a = a ^ b;  // 取出集合的另一个元素  


结果:  a=50  ,    b=10  ;

 
 这种方式不用担心数据溢出,应该算是就地交换两个数的最佳解决方案了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值