我正在尝试创建一个掩码,以查看Java中长的特定位。我尝试了以下内容:
long mask = ~ (0xffffffff << 32);
如果我在控制台上打印它,它将返回0,但我期望4294967295,因为我的结果看起来像0x00000000000000ffffffffl和2^32-1等于4294967295。
long mask = ~ (0xFFFFFFFFFFFFFFFFL << 32);
谁能解释我这种行为?
java假设,如果您要在ints
上执行算术操作,则需要将int
退回,而不是long
。(完成计算后将输出分配给long
的事实不会影响计算本身。)
左移动int
(32位)x 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个位置。
左移是模量和dagger;数据类型的大小,例如int的转移32位无效。
(0xffffffff << 32) ==
(0xffffffff << (32 % Integer.SIZE)) ==
(0xffffffff << (32 % 32)) ==
(0xffffffff << 0) ==
0xffffffff
和0xffffffff
的~
是0x00000000
,即0
,您可以看到。
然后使用64位,全32位移位均小于64:
(0xffffffffL << 32) ==
(0xffffffffL << (32 % Long.SIZE) ==
(0xffffffffL << (32 % 64) ==
(0xffffffffL << 32) ==
0xffffffff00000000L
&dagger;严格来说,它将最后5位用于ints,而最后6位则持续了6位,这与模量对负左移有所不同。