每天一道题
本人把我自己学习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
好了,今天就这样了。
晚安!