引言
前两天在知乎上看到一道很有意思的题,今天自己实践了一下,拿出来分享一下;
题目很简单
public boolean isO(int i);
判断传进来的这个数是不是奇数并补全这个函数;
这个题用c语言都是一道很简单的题;在这里更是非常简单;答案1:
public boolean isOdd(int i) {
if (i % 2 == 1) {
return true;
} else {
return false;
}
}
这是第一种写法,看上去没有错误,实际上也没有错误,那怎么样能把这个代码写得更加美观高效呢,boolean
类型是布尔类型就是用来判断正误的所以我们其实可以这么写:
public boolean isO(int i) {
return i%2 == 1;
}
这么写传进来一个负数怎么办,于是现在有了第三种写法:
public boolean isO(int i) {
return i%2 != 0;
}
那么还有没有更高效的,我们知道取模运算没有位运算速度快,我们还知道二进制中奇数最后一位为1,偶数最后一位为0;所以最后一种写法是这样的:
public boolean isO(int i) {
return (i&1) == 1;
}
那么还有一个问题第三种和第四种哪一个运行出来更快,我们用事实说话:
import java.lang.System;
public class Main {
public static void main(String[] args) {
long startTime = System.nanoTime();
judge(10);
long endTime = System.nanoTime();
System.out.println("程序运行时间" + (endTime - startTime) + "ns");
startTime = System.nanoTime();
judge2(10);
endTime = System.nanoTime();
System.out.println("程序运行时间" + (endTime - startTime) + "ns");
}
public static boolean judge(int i) {
return i%2 != 0;
}
public static boolean judge2(int i) {
return (i&1) == 1;
}
}
我们可以看到第三种是快于第四种的,为什么呢?
因为编译器在遇到取模运算的时候会自动优化成位运算!!!
看完我觉得很有意思,所以拿出来分享一下