移位不是循环的;对于
ints 移位,Java仅使用5个最低有效位,因此
(b << 0)等效于
(b << 32)(等效于
(b <<64)等)。您可以简单地求出移位量,然后除以32的余数。
移位
longs 也会发生类似的情况,其中Java仅使用6个最低有效位,因此
(aLong << 0)等效于
(aLong << 64)。
JLS的第15.19节谈到了这一点:
如果左侧操作数的提升类型为int,则 仅 将右侧操作数的 最低5位
用作移位距离。就像右侧操作数受到掩码值0x1f(0b11111)的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到31(含)范围内。如果左侧操作数的提升类型很长,则 仅 将右侧操作数 的六个最低位
用作移位距离。就像右侧操作数受到掩码值0x3f(0b111111)的按位逻辑AND运算符&(§15.22.1)一样。因此,实际使用的移动距离始终在0到63之间(包括0和63)。
(强调我的)
(你不能位移位
floatS或
doubleS,并试图位移
short或
byte将受到价值 一元数值提升 到一个
int反正。)
您
0来自
16 << 30,因为1位来自
16
00000000 00000000 00000000 00010000
从的结尾移开
int并被丢弃。
// Discarded - Result----------------------------- (00000100) 00000000 00000000 00000000 00000000



