我正在研究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让我们稍有不同。二进制文件中的311。因此,只有当prolepticYear中的最后两位为零时,11prolepticYear才会为零。 (实际上称为位掩码)。

现在再想点不同:

 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中选择存储桶的方式,但此处不是这种情况)

07-24 09:37