[英]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.