繁体   English   中英

为什么将带波浪号的移位整数掩码转换为长返回零? (Java,移位)

[英]Why does a shifted integer mask with a tilde casted to a long return zero? (Java, bit shift)

我正在尝试创建一个掩码来长时间查看Java中的特定位。 我尝试了以下方法:

long mask = ~ (0xffffffff << 32);

如果我在控制台上打印此内容,它将返回0,但我希望是4294967295,因为我的结果应该像0x00000000FFFFFFFFFFL,而2 ^ 32-1等于4294967295。

long mask = ~ (0xFFFFFFFFFFFFFFFFL << 32);

谁能解释我的这种行为?

Java假定,如果您要对ints执行算术运算,那么您想找回一个int ,而不是long (将输出分配给计算完成long之后,这一事实并不影响计算本身。)

int (32位)左移32位将无济于事。 当您将int左移时,仅会使用右侧操作数的五个最低位,其数字范围为0到31。
http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19

这就是为什么(0xffffffff<<32)==0xffffffff~(0xffffffff<<32)==0

移位long整数(64位)时,将使用最低的六个位,其数字范围为0到63。

如果使用0xffffffffL ,则Java将知道产生另一个long 因此,您可以移动32位而不会超出数字的左端。

左移是模数†数据类型的大小,例如,将int移32位无效。

(0xffffffff << 32) ==
(0xffffffff << (32 % Integer.SIZE)) ==
(0xffffffff << (32 % 32)) ==
(0xffffffff << 0) ==
0xffffffff

0xffffffff ~0x00000000 ,即0 ,这就是您所看到的。

然后使用64位,因为它小于64,所以将应用完整的32位移位:

(0xffffffffL << 32) ==
(0xffffffffL << (32 % Long.SIZE) ==
(0xffffffffL << (32 % 64) ==
(0xffffffffL << 32) ==
0xffffffff00000000L

†严格来说,整数需要使用最后5位,而long则需要使用最后6位,这导致负向左移的模数有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM