检查闰年 - 不使用除法运算

Check Leap Year - without using division operation

如何在不使用除法运算的情况下检查给定年份是否为闰年 Java 中的一些库方法。是否可以使用按位运算符进行检查?

PS:几个世纪以来都不需要验证

这里有一些不使用模函数识别闰年的方法。

首先,我们假设(或测试)年份在 1901 - 2099.

范围内
  • 以二进制数表示的闰年将 00 作为 最后两位数。所以:

    今年是闰年if year & (not 4) == 0

  • 如果您有一个函数可以将实数截断为 整数那么这有效:

    x = trunc(year / 4)

    闰年if x * 4 == year

  • 如果你有移位(不是循环移位)运算符,我敢肯定 Verilog 则:

    x = year >> 2

    今年是闰年if (x << 2) == year

如果关于范围 1901 - 2099 的假设是错误的,那么您将需要一些额外的逻辑来消除 1900, 1800, 1700 and 2100, 2200, 2300 and so on

嗯,当然。由于除法或 mod 除以 2 的幂(在本例中为 4),只是一个位检查。

boolean isLeapYear( int year ) {
    return (( year & 3 ) == 0 );  // if the bottom two bits are 0, then the int is divisible by 4
}

请注意这并不完美,因为有些世纪不是闰年,但这似乎与您的问题无关(如您现在所述)。

是的,您可以在不使用任何算术运算的情况下完成。使用从年份映射到布尔值的地图 - 无论年份是否为闰年。

  • 如果年份是世纪年,意思是可以被100整除,那么需要被400[=27=整除] 被称为 闰年 .

  • 如果年份不是世纪年,则需要被4整除才能称为闰年

下面的代码使用 二进制搜索 来检查一个数字是否可以被另一个数字整除(因为 / 是不允许的,我不确定你是否可以尽管使用 %)。

    public static boolean isLeapYear(int year){
        return isDivisible(1,year,100,year) ? isDivisible(1,year,400,year) : isDivisible(1,year,4,year);
    }

    private static boolean isDivisible(int low,int high,int divisor,int dividend){
        int mid = 0;
        while(low <= high){
            mid = low + ((high - low) >> 1);
            int result = divisor * mid;
            if(result == dividend) return true;
            else if(result > dividend) high = mid - 1;
            else low = mid + 1;
        }

        return false;
    }
Year.isLeap(someYear)

您应该更具体地说明您的要求,这是一个面向程序员的网站:)