交换两个变量的值,不使用第三个变量的方法

每天一道题

本人把我自己学习JAVA的一些笔记心得写出来,大家一起交流,每天一道题,有些是传授的面试题,有些是我记得的一些做过的题,希望对初学者有帮助。我们还是按照Java的学习顺序来,开始是SE部分。

OK,言归正传,进入今天的学习。

今天上课,老师说到研究生面试,他问了一位学生,说怎么用计算机实现求 2*8 的结果?当时就把学生问懵了。显然这里老师问的是最高效率,当然在微机原理我们已经学过,我觉得应该是:

System.out.println(2 << 3);

这是因为算数右移一位相当于有符号数除以2,逻辑左移一次相当于无符号数乘以2,逻辑右移一次相当于无符号数乘以2。

好了,这只是个引子,今天的问题是:

Q1: 我们都知道交换两个数的数值可以用三行代码解决,这是在C语言中就学过的:

int c;
c = a;
a = b;
b = c;

但是我们如果把两个整数数值设置得非常大,那么就会超出int的范围,会发生强制转化,这是显然很令人郁闷的。如果有要求不能用第三个参数来进行交换操作呢?

数学老师可能会给我们这个建议:

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

看似很完美了,可是面试的时候可能这个还不是面试官想要的答案,我觉得我能写出来的最好的代码就是下面这个了,欢迎大家指教:

a = a ^ b;   
b = a ^ b;    //(a^b)^b=a
a = a ^ b;    //(a^b)^a=b

按位运算符-异或的性质:a^b^b=a

关于位运算,大家可以看看这篇博客,写的还是很全的:

http://blog.csdn.net/is_zhoufeng/article/details/8112199

好了,今天就这样了。

晚安!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值