Java 8 的 isLeapYear 实现。逻辑运算符是什么意思?

3

我正在研究 Java 8 中关于日期 API 的实现,并找到了以下内容:

根据ISO全历法规则,检查年份是否为闰年。

此方法在整个时间线上应用当前的闰年规则。通常,如果一个年份能够被4整除,则它是闰年。但是,如果一个年份能够被100整除,则它不是闰年,但是如果这个年份能够被400整除,则是闰年。

例如,1904年是闰年,因为它可以被4整除。1900年不是闰年,因为它可以被100整除,然而2000年是闰年,因为它可以被400整除。

计算是先行的——将相同的规则应用到遥远的未来和过去。这在历史上是不准确的,但对于ISO-8601标准是正确的。

public boolean isLeapYear(long prolepticYear) {
        return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
    } 

但是给我们一个prolepticYear和3。
11111001111
    &
00000000011
00000000011

什么是prolepticYear & 3?

3
prolepticYear 大于等于0时,prolepticYear & 3 等同于 prolepticYear % 4。其中 & 是按位与运算符。 - Thomas Fritsch
2个回答

6

prolepticYear & 3 的意思可以稍微改一下。 3 的二进制表示是11。因此,只有当prolepticYear的最后两位为零时,prolepticYear & 11才会为零。(这实际上被称为位掩码)。

现在再换个角度思考:

 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

通常情况下,&操作比%操作更快。
有时候&也被用于其他目的(%操作可能会产生负数,而&不会-这是根据Key#hashcode可能为负值来选择HashMap中的桶的方式,但在这里不是这种情况)。

3

(prolepticYear & 3) == 0 检查 prolepticYear 的最后两位是否为 0,如果是,则表示该年份能够被4整除。

换句话说,这个操作等同于检查 prolepticYear 是否为4的倍数。

简而言之,

(prolepticYear & 3) == 0

等同于

(prolepticYear % 4) == 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接