我是一名 Java 新手程序员,正在阅读Bruce Eckel 的Thinking In Java。
在第 5 章中,已经讨论了运算符。在谈论移位运算符(<<、>>、>>>)时,他说:
如果你移动一个 char、byte 或 short,它会在移动发生之前被提升为 int,结果将是一个 int。将仅使用右侧的五个低位。这可以防止您移动的位数超过 int 中的位数。如果你操作很长时间,你会得到很长的结果。将仅使用右侧的六个低位,因此您不能移位超过 long 中的位数。
我无法理解其中的含义。特别是加粗的句子。你能澄清一下吗?
我觉得其他答案有点不完整。
anint确实是 32 位,并且该语言不允许您移位超过 32 位。被遗漏的是,如果你告诉它移位超过 32 位,移位量将取模 32。也就是说,如果x是一个int,x >> 32与x >> 0(即只是x)x >> 33相同x >> 1,x >> 66与 相同,是相同的asx >> 2等。仅使用右参数的低 5 位与取参数模 32 相同(使用数学定义,因此 -1 mod 32 == 31、-2 mod 32 == 30 等.)
类似地,long是 64 位,这意味着右参数是以 64 为模计算的,这与仅使用右参数的低 6 位相同。
为什么 Java 这样做,我不知道。在我看来,如果它只是让您大量移位,将所有位移出整数并导致 0(>>符号扩展除外,因此结果将为 0 或 -1),则会更加一致。它在数学上是一致的,因为对于正数xand y,即使>= 32x >> y也总是等于x / (2^y)截断为整数y。 Java 处理 >= 32 或 >= 64 的移位量的方法在任何情况下都没有用我可以看到。