如何在不使用除法运算的情况下检查给定年份是否为a年或 Java中的一些库方法。是否可以使用按位运算符进行检查?
PS:几个世纪以来没有必要进行验证
答案 0 :(得分:3)
这里有一些不使用模函数即可识别leap年的方法。
首先,我们假设(或测试)年份在=IF(AND(VALUE(LEFT(A$1, FIND(" ", A$1&" ")))<=E2, VALUE(REPLACE(A$1, 1, FIND("~", A$1&"~"), ""))>=E2), B$1, "out of range")
范围内。
用二进制数表示的leap年将以1901 - 2099
作为
后两位数字。所以:
这是a年00
如果您有一个函数可以将实数截断为 整数则有效:
if year & (not 4) == 0
这是a年x = trunc(year / 4)
如果您有移位(非循环移位)运算符,我相信 然后,Verilog具有:
if x * 4 == year
这是a年x = year >> 2
如果关于范围为if (x << 2) == year
的假设是错误的,那么您将需要一些额外的逻辑来消除1901 - 2099
。
答案 1 :(得分:2)
好的,当然。由于除以2的幂(在这种情况下为4)或除,只是一点点检查。
boolean isLeapYear( int year ) {
return (( year & 3 ) == 0 ); // if the bottom two bits are 0, then the int is divisible by 4
}
请注意,这并不是完美的,因为几个世纪以来还不是leap年,但这似乎与您的问题无关(正如您现在所说的那样)。
答案 2 :(得分:1)
如果年份是一个世纪年,意味着可以被 100 整除,那么它需要被 400 整除才能被称为飞跃年。
如果一年不是世纪年,则需要将其除以 4 作为called年。
以下代码使用二进制搜索来检查一个数字是否可被另一个数字整除(由于不允许/
,因此我不确定是否可以使用{{1} })。
%
答案 3 :(得分:0)
是的,您可以执行此操作而无需使用任何算术运算。使用从年份到布尔值的映射-年份是is年还是否。
答案 4 :(得分:0)
Year.isLeap(someYear)
您应该更具体地满足您的要求,这是一个供程序员使用的网站:)