java位操作>>>移位

为什么如果

int x = -1 // binary: 11111111111111111111111111111111 x = x >>> 31; 

我们有00000000000000000000000000000001

但如果

 int x = -1 x = x >>> 32; 

我们有11111111111111111111111111111111(再次-1)

但不是00000000000000000000000000000000?

从JLS的第15.19节 :

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

强调我的。 所以:

 x >>> n 

相当于:

 x >>> n & 0x1f // or x >>> n % 32 

所以, x >>> 32相当于x >>> 32 & 0x1f <==> x >>> 0 == x

因此,经验法则是,每当您将数字移动32的倍数( int32 bits )时,您将获得相同的值。

当应用位移操作时,仅考虑右手操作数的最低5位。 由于32 === 0 // mod 32,结果是没有移位。

花了整整一天时间为什么长时间l = i << 32表现得很奇怪,然后写了一些基本测试,有了WTF时刻,然后长时间l =(长)i << 32让它工作。

我唯一补充Rohit的答案就是为什么会这样。 来自IA-32英特尔架构软件开发人员手册3:

8086不掩盖class次计数。 但是,所有其他IA-32处理器(从Intel 286处理器开始)确实将移位计数屏蔽为5位,最大计数为31.此屏蔽在所有操作模式(包括虚拟8086模式)下完成减少指令的最大执行时间