最近辞职赋闲在家,偶尔翻了一下Java书,尼玛,很多东西不是忘的干干净净,就是模棱两可,所以抽时间又复习了一下Java基础,以前没有记录的习惯,导致技术老是上不去,所以下决心坚持记录一些东西,也和大家分享一下;有错误的地方,希望大家指出,共同学习,偶在此拜谢!
之前在一位仁兄的blog:http://my.oschina.net/lirongwei,看到几道面试题.试着分析了一下。
一、 int result = [(oxfe2baf&oxf)|oxff] >> 2/(4<<1);
这道题感觉挺好玩,因为位运算是偶的弱项中的弱项,所以就分析一下, 根据这道题,
首先算一下小括号里面的运算,比较简单的是4<<1,4往左移一位,相当于乘以一个2(具体算法,就不提了,有兴趣大家自己查吧),所以4<<1 = 8;
然后,再计算另一个小括号里面的 0xfe2baf & 0xf; 在“&”符号两边不是布尔型时,“&”表示按位与操作(当两边操作数的位同时为1时,结果为1,否则为0),一般我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位(oxf 不管怎么跟哪个整数进行运算,都是取该整数的最低4个bit位,因为不管多少位0xf ;最后4位都是1111,前面不够的补0;不管跟谁做&运算,都相当于跟1111,做&运算,具体的计算大家可以把它们转化为二进制自己算一下,反正我是挺讨厌这个东西),这样就算出0xfe2baf&0xf = 0xf;
经过这样计算简化后的表达式 就是[0xf|0xff] >> 2/8; 现在计算0xf|oxff ; 0xf = 0000 1111; 0xff = 1111 1111;(具体的进制转换我就不说了啊),根据按位或(当两边操作数的位有一边为1时,结果为1,否则为0),所以结果是1111 1111=oxff;
这样表达式就成了 0xff >> 2/8 ;根据Java运算符的优先级,先算2/8 = 0.25,又因为是int计算要转换成int 型,所以 为0;0xff >>0 还是0xff ,所以最后结果为0xff ,也就是255.
二、 int a = 1; int result = a++ + 3 << 2;
这道题稍微简单,主要考虑的是 a++ 和 ++a ,容易搞混(反正我是搞混过),根据Java运算符优先级,先算a++,
a++ 表示在调用a之后+1;所以 表达式变成了 1+3 << 2 ; 结果为 16;
三、int a = 2 ; int result = (a++ > 2) ? (++a) : (a+=3)
这道题比上一道题略微复杂一些,首先,这是个三目运算,先判断a++ > 2 是否为true,在调用a 之前a 是不会自增1的,所以 (a++ > 2) = false; 这时 a已经调用了,所以现在a自增1,a = 3,所以最后的结果为 6;
四、 int a = 1234567; int b = 0x06 ; int result = a&b;
这个问题类似0x0f与任何整数进行& 运算都取该整数的最低4个byte位类似,在& 两边不是boolean 型时,进行按位与操作;首先找到两边最小的整数 0x06 = 0110; 不管跟它运算的整数有多大 都要跟其最后四个位 运算就可以得到结果;所以 该问题就可以变为 0x06 & 0x07 , 最后结果为 0x06.
五、Integer a = 34556; Integer b = 34556; boolean result = a==b;
这道题要考虑的是 Java1.5之后的新特性:基本数据类型的自动封箱和自动拆箱。,Integer a = 34556;Integer b = 34556;相当于 装箱 这里要考虑的是Integer 是一个对象,这就相当于在内存里申请了地址,两个引用a跟b 就有了两个地址,所以使用“==” 比较的时候,会返回false.
六、byte result = (byte) 0xffeffefe;
这道题要考虑类型转换跟byte的取值范围,byte是1个字节,也就是8位,byte取值范围是 0111 1111 ~ 1111 1111 (即 127~ --128),但是 0xffeffefe;的大小显然超出了 byte的取值范围,所以只能取 最后8位,所以为1111 1110,首位为1,所以该数为负数,在计算机中负数用的是补码表示,所以要转换成原码,首先减一得到 1111 1101 ,然后符号位不变,按位取反得到1000 0010,转换为十进制 得到 -2。
七、 String func(string s ){
return s.length() > 0 ? func(s.subString(1))+ s.charAt(0):"";
}
String result = func("Tencent");
这是一个递归,将“Tencent” 倒序排列,得到 tnecneT。