如何理解闰年判断代码中year & 3、year & 15位运算的含义
运算符含义解释
这里的单个&是按位与运算符,属于位运算符的一种,会对两个数的二进制每一位逐一运算,规则为:只有对应二进制位均为1时,该位的运算结果才为1,否则为0。
year & 3的作用
3的二进制表示为11,将年份和3做按位与运算,本质是提取年份二进制的最后两位。
当year & 3的结果为0时,说明年份二进制最后两位均为0,等价于年份可以被4整除,和常规判断的year % 4 == 0逻辑完全一致,位运算的执行效率比取模运算更高。
year & 15的作用
15的二进制表示为1111,将年份和15做按位与运算,本质是提取年份二进制的最后四位。
当year & 15的结果为0时,说明年份二进制最后四位均为0,等价于年份可以被16整除,对应year % 16 == 0的判断逻辑。
整个表达式的逻辑对应
你给出的三目运算(year & 3 || !(year % 25) && year & 15 ? 28 : 29),作用是「当年不是闰年时返回28,是闰年返回29」,和常规闰年判断规则完全对应:
- 按照运算符优先级规则,
&&优先级高于||,表达式会先计算!(year % 25) && year & 15,再和前面的year & 3做逻辑或运算 - 当
year & 3非0:说明年份不能被4整除,不是闰年,触发返回28 - 当
year & 3为0(能被4整除)时,进入后半段判断:!(year % 25)为真代表年份能被25整除,结合前面已经满足的「能被4整除」条件,等价于年份能被100整除- 此时如果
year & 15非0,说明年份不能被16整除,即年份能被100整除但不能被16*25=400整除,不是闰年,触发返回28
- 除上述两种情况外,均为闰年,返回29
内容的提问来源于stack exchange,提问作者Ross Symonds
相关产品推荐
相关产品推荐

