记一个有趣的java题

引言

前两天在知乎上看到一道很有意思的题,今天自己实践了一下,拿出来分享一下;


题目很简单

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;
    }
}

在这里插入图片描述
我们可以看到第三种是快于第四种的,为什么呢?
因为编译器在遇到取模运算的时候会自动优化成位运算!!!
看完我觉得很有意思,所以拿出来分享一下

发布了35 篇原创文章 · 获赞 82 · 访问量 7527

猜你喜欢

转载自blog.csdn.net/qq_44049351/article/details/103129949