共同点:
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),
当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否则,只要有一方为 false,则结果为 false。
不同点:
- &&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,
例如,
对于if(str != null && !str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将&&改为&,则会抛出 NullPointerException 异常。If(x==33 & ++y>0) y 会增长,If(x==33 && ++y>0)不会增长
- &还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,
我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,0x31 & 0x0f 的结果为 0x01。
备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。
0x31 & 0x0f 的结果为 0x01
详解:
首先0x31 & 0x0f 中ox是告诉你是十六进制没有其他含义,为了进行位与计算,我们需要将十六进制化为十进制,计算方法(在十六进制中0到9对应0到9,A到F对应10到15):
0x31=3*16+1=49;
ox0f=0*16+15=15;
将十进制化为二进制的两种方法:
所以0x31的二进制为0011 0001,ox0f的二进制为0000 1111,
&用作位运算符,位与操作是两个数对齐,全为1位结果为1,否则为0:
0011 0001
0000 1111
结果:0000 0001,0x31 & 0x0f 的结果为0x01