为什么 (52 & (1 << 37)) 不返回 0?

Jak*_*one 0 java bit-manipulation

我正在尝试制作一个给定整数的算法,吐出其二进制形式的字符串表示形式。

现在,我基本上是在比较一个掩码以查看在哪里添加 1/0 位。这工作正常,直到出现稍大的数字,例如:(52 & (1 << 37))如果我正确理解位移运算符(显然我没有)应该返回 0,因为(1 << 37)=1和 37 * 0。现在我上次检查,52二进制格式的十进制第38位没有1 ,那么为什么返回32?

Ste*_*n C 6

整个表达式使用 32 位数字执行,因为所有操作数都是int值。

因此1 << 37,不是“一”后跟 37 个“零”位。

事实上,JLS 15.9说移位计数被屏蔽了0x1f(对于 32 位移位运算符)。因此1 << 37实际上与1 << 5; 即“一”后跟 5 个“零”位。

如果要在移位表达式中使用 64 位整数,第一个操作数必须是long; 即(52 & (1L << 37))