在Java中苦苦挣扎

时间:2012-10-09 10:18:05

标签: java

来自here

  

当要移位的值(左操作数)是int时,只使用右操作数的最后5位来执行移位。 shift的实际大小是由31(0x1f)屏蔽的右侧操作数的值。即移位距离始终在0到31之间(如果移位值> 32移位是32%值)

35             00000000 00000000 00000000 00100011
31 -> 0x1f     00000000 00000000 00000000 00011111
&              -----------------------------------
Shift value    00000000 00000000 00000000 00000011   -> 3

-29            11111111 11111111 11111111 11100011
31 -> 0x1f     00000000 00000000 00000000 00011111
&              -----------------------------------
Shift value    00000000 00000000 00000000 00000011   -> 3

这到底是什么意思?对于右移是否意味着,你可以乘以的最大值是32?这是为了防止溢出吗?

2 个答案:

答案 0 :(得分:2)

这意味着您只能移位0到31之间的值,因为int类型中有32位。对于long,您只能将0移位到63位。

如果您为其提供任何其他值,则会根据需要使用& 31& 63屏蔽转移的金额。

e.g。如果你想要一个符号扩展低7位的数字,你可以使用

n << -7 >> -7

无论nint还是long

,这都有效

来自JLS 15.19

  

如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。

     

如果左侧操作数的提升类型很长,则只使用右侧操作数的六个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x3f。因此,实际使用的移位距离始终在0到63之间,包括0和63.

答案 1 :(得分:2)

这不是你可以乘以的最大值是32,它是 2 ^ 31 。 (位移是取幂,而不是乘法)

考虑到整数只有32位,如果你移动的位数超过31位,你会发生什么呢?无论你的输入值是什么,你都会得到完全相同的结果 - 它的所有位都会被“移到最后” - 所以它不会作为一个操作。