Java 8是LeapYear实现.逻辑运算符意味着什么

Xel*_*ian 3 java api java-8

我正在研究Date API的java 8实现,并发现了这一点

根据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);
    } 
Run Code Online (Sandbox Code Playgroud)

但是请给我们预感和3.

11111001111
    &
00000000011
00000000011
Run Code Online (Sandbox Code Playgroud)

什么意思是prolepticYear&3.

Eug*_*ene 6

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
Run Code Online (Sandbox Code Playgroud)

通常&操作比此快%.

有时&也用于其他目的(%操作可能会产生负数,而&不会 - 这HashMap就是根据可能的负值选择a里面的桶Key#hashcode,但不是这里的情况)