记一个有趣的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;
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值