题目很简单,完成代码,判断一个整数是否是奇数:
public boolean isOdd(int i){
// TODO This
}
第一想法为:
public boolean isOdd(int i) {
if (i % 2 == 1) {
return true;
} else {
return false;
}
}
问题: if 后面的括号里面的表达式的值是一个什么类型的?
代码优化为:
public boolean isOdd(int i) {
return i % 2 == 1;
}
问题:参数传进来一个 - 1 呢?
代码优化为:
public boolean isOdd(int i) {
return i % 2 != 0;
}
这是迄今为止第一个能通过编译且完全满足了需求的代码实现了,但是取模操作比较慢,有更快的解决方案吗?(埋坑标记)
奇数和偶数转换成二进制后奇数最后一位是 1,偶数最后一位是 0。
移位操作(手动滑稽):
public boolean isOdd(int i) {
return i >> 1 << 1 != i;
}
优化后:
public boolean isOdd(int i) {
return (i & 1) == 1;
}
但是我们实际代码测试过,发现上面的【按位与操作】和【取模操作】,实际运行的时间是差不多的,为什么呢?
详情参考:https://zhuanlan.zhihu.com/p/57859872
思路和分析过程(编译器会将对2的指数的取模操作,优化成位运算操作。)