来自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?这是为了防止溢出吗?
答案 0 :(得分:2)
这意味着您只能移位0到31之间的值,因为int
类型中有32位。对于long
,您只能将0移位到63位。
如果您为其提供任何其他值,则会根据需要使用& 31
或& 63
屏蔽转移的金额。
e.g。如果你想要一个符号扩展低7位的数字,你可以使用
n << -7 >> -7
无论n
是int
还是long
如果左侧操作数的提升类型为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位,你会发生什么呢?无论你的输入值是什么,你都会得到完全相同的结果 - 它的所有位都会被“移到最后” - 所以它不会作为一个操作。