为什么将带有tilde的tilde转移到零返回为零的情况下?(Java,位移动)



我正在尝试创建一个掩码,以查看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位,这与模量对负左移有所不同。

最新更新