为Java long类型设置第32位会产生-1

时间:2012-02-21 03:38:32

标签: java bit-manipulation

我使用Java的原始长数据类型来存储标志。 long有8个字节,所以64位高位表示符号位,所以我们有63个可用位作为标志。 一切正常,直到我打开32位产生-1。为什么会这样?

编辑:基本上我试图在一个小时内标记长数据类型的前60位(1位表示一小时内的一分钟)的可用性。我们假设开始时间是0:0:00。如果结束时间达到0:30:00但是0:31:00到60分钟失败,则一切正常,这意味着当我尝试(值&(1<< 31))初始化为某个值时0这不会返回2 ^ 31而是返回-1。

编辑:将掩码声明为1L而不是1解决了问题。

3 个答案:

答案 0 :(得分:3)

你应该粘贴你的代码,但我的猜测是你在数学中的某个地方有一个“int”,并且在它被强制转换为长期之前会变成-1。

答案 1 :(得分:2)

我认为这是你的错误:

(1 << mIndex)

这是1 int的转变。如果您对int执行轮班,则结果将为int,即使第二个操作数大于32。

请改为尝试:

(1L << mIndex)

答案 2 :(得分:0)

与Lawrence Kesteloot达成一致,但如果你仍然没有运气,这可能是你的JVM实施中的一个错误。使用java.util.BitSet类也可能会有更好的运气。