右移和左移运算符中的java不对称

Sur*_*esh 0 java bit-shift

请考虑以下代码.

  1. 1 >> 34 = 0,
  2. 1 << 34 = 4 //循环移位

为何如此不对称?

Roh*_*ain 5

来自JLS§15.19:

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

所以,这不是<<循环而>>不是循环.这只是你选择的价值,让你相信.

与移位134,考虑到最低5位:

1 >> 34  === 1 >> 2 === 0
1 << 34  === 1 << 2 === 4
Run Code Online (Sandbox Code Playgroud)

自从34 & 0x1F == 2.

现在,取一些更大的值,换位的技术2不会让你0:

4 >> 34 == 4 >> 2 == 1
4 << 34 == 4 << 34 == 16
Run Code Online (Sandbox Code Playgroud)

int始终使用5个最低位来计算类型的移位距离.这不是循环换班操作.它们都不是.这就是他们的行为方式.