Java移位算子与自动提升

Java Shift Operator and auto promotion

我是一个新手Java程序员,Bruce Eckel正在用Java阅读思维。

在第五章中,我们讨论了运算符。他说:

If you shift a char, byte, or short, it will be promoted to int before
the shift takes place, and the result will be an int. Only the five
low-order bits of the right-hand side will be used. This prevents
you from shifting more than the number of bits in an int. If you’re
operating on a long, you’ll get a long result. Only the six
low-order bits of the right-hand side will be used, so you can’t
shift more than the number of bits in a long.

我不明白它的意思。尤其是粗体句子。你能解释一下吗?


我觉得其他答案有点不完整。

的确,一个int是32位的,而且语言不允许您移动超过32位。剩下的是,如果你告诉它移位超过32位,移位量将取模32。也就是说,如果xint的话,x >> 32x >> 0相同(即只有x),x >> 33x >> 1相同,x >> 66x >> 2相同等,只使用右参数的低阶5位与取参数模32相同(使用数学定义离子,因此-1 mod 32==31,-2 mod 32==30等)。

同样,long是64位的,这意味着右参数是计算模64,这与仅使用右参数的低阶6位相同。

为什么Java这么做,我不知道。在我看来,如果它简单地让你移动大量,将所有的位从整数中移出,并得到0(除了>>号扩展,那么结果将是0或-1),那就更加一致了。在数学上是一致的,因为对于正的xyx >> y总是等于x / (2^y)被截断为整数,即使y大于等于32。Java处理移位量为>=32或>=64的方法在我所能看到的任何方面都是无效的。


移位操作的结果视左侧而定,可以解释为intlong

当左侧为int或更低(8位byte、16位char、16位short时,为int(32位)

当左侧为long时,long位(64位)

为了将结果限制在这些界限内,必须按以下方式限制右侧:

Only the five low-order bits of the right-hand side will be used.

不允许超过31个班次(0001 1111)

Only the six low-order bits of the right-hand side will be used.

不允许超过63的班次(0011111)

如果使用的数字大于接受的数字,则结果将只使用较低的位(更右边)有效地执行32或64的模运算。


他指的是从你移动的数字中使用的位数,所以对于一个整数,"右手边的五个低阶位"给你5位=2^5=32位,你可以移动整数。类似地,6位=2^6=64,因此只能将long移位64位。请注意,这些数字分别对应于int和long的大小。