您的位置:首页 > 理论基础

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

2016-11-13 22:27 573 查看

每天一道题

本人把我自己学习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

好了,今天就这样了。

晚安!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息