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

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

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

回答

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

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

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

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


以上是为什么(52&amp;(1&lt;&lt;37))不返回0?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>