我正在研究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.
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,但不是这里的情况)
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |