Java谜题1:表达式谜题
N0.1 奇数性
public static boolean isOdd(int i){
return i % 2 ==1;
}
这个方法有错误,因为取余(%)操作返回一个非零的结果时,它与左操作数具有相同的正负符号。
在任何负数上调用该方法都会返回false,不论奇偶。
改正方法:将 i % 2 与1比较该为与零比较。
public static boolean isOdd(int i){
return i % 2 !=0;
}
如果正在一个性能临界(performance-critical)环境中使用isOdd方法,那么用位操作符逻辑与AND(&)来替代取余操作符会显得更好:
public static boolean isOdd(int i){
return (i & 1) !=0;
}
Java 位操作符
无符号右移位操作符“>>>”在将bit串右移位时,从bit串的最左边填充0,这和带符号右移位操作符“>>”不同。
“>>”在将bit串右移位时,从bit串的最左边填充原来最左边的位。
也就是说,bit串原来最左边的位是符号位,如果为1,则在带符号右移时最左边始终填充1;如果为0,则在带符号右移时最左边始终填充0。
移位操作符的例子见下表。
操作 | 结果 | 说明 |
00110010 << 2 | 11001000 | 右边始终填充0 |
00110010 >> 2 | 00001100 | 结果一样 |
00110010 >>> 2 | 00001100 | |
10110010 >> 2 | 11101100 | 结果不同 |
10110010 >>> 2 | 00101100 |
“按位与”操作符“&”对两个bit串按位进行逻辑与,“按位或”操作符“|”对两个bit串按位进行逻辑或,“按位异或”操作符“^”对两个bit串按位进行异或操作。
运算规则如下表所示。
按位与 | 按位或 | 按位异或 |
0 & 0 = 0 | 0 | 0 = 0 | 0 ^ 0 = 0 |
0 & 1 = 0 | 0 | 1 = 1 | 0 ^ 1 = 1 |
1 & 0 = 0 | 1 | 0 = 1 | 1 ^ 0 = 1 |
1 & 1 = 1 | 1 | 1 = 1 | 1 ^ 1 = 0 |