我正在研究Date API的Java 8实现,并发现了这一点
根据ISO专家检查年份是否为a年
日历系统规则。
此方法将当前rules年规则应用于整个
时间线。通常,如果一年可以被整除,则为is年
四无余数。但是,被100整除的年份不是飞跃的
年,但可以除以400的年份除外。
例如,1904年是a年,可以被4整除。1900年不是
100年,因为它可以被100整除,但是2000年是as年
它可以被400整除。
计算是多方面的-将相同的规则应用到远端
future 和遥远的过去。从历史上看这是不正确的,但是正确的
用于ISO-8601标准。
public boolean isLeapYear(long prolepticYear) {
return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
}
但是给我们多产的年份&3。
11111001111
&
00000000011
00000000011
什么是prolepticYear&3。
最佳答案
prolepticYear & 3
让我们稍有不同。二进制文件中的3
是11
。因此,只有当prolepticYear
中的最后两位为零时,11
和prolepticYear
才会为零。 (实际上称为位掩码)。
现在再想点不同:
0100 - (4 in decimal, has last two bits zero)
1000 - (8 in decimal, has last two bits zero)
1100 - (12 in decimal, has last two bits zero)
... these are numbers divisible by four
通常,
&
操作比%
更快。有时
&
也可用于其他用途(%
操作可能会产生负数,而&
不会产生负数-这是根据HashMap
可能为负值在Key#hashcode
中选择存储桶的方式,但此处不是这种情况)