Java Shift操作员和自动升级

时间:2015-05-08 05:21:00

标签: java bit-shift

我是一名新手Java程序员,正在阅读Bruce Eckel撰写的Thinking In Java

在第5章中,讨论了运营商。在谈论转移运营商(<<<<>>,>>>)时,他说:

  

如果移位char,byte或short,它将被提升为int之前   转移发生,结果将是一个int。 只有五个   将使用右侧的低位位。这可以防止   你转移的数量超过了int中的位数。如果你是   经营很长时间,你会得到很长的结果。 只有六个   右侧的低位将被使用,所以你不能   移位超过长的位数。

我无法理解其含义。特别是大胆的句子。你能澄清一下吗?

3 个答案:

答案 0 :(得分:4)

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

int是32位是正确的,并且该语言不允许您移位超过32位。遗漏的是,如果你告诉它移位超过32位,那么移位量将采用模32的方式。即,如果xint,{{1 }}与x >> 32相同(即只有x >> 0),xx >> 33相同,x >> 1x >> 66相同仅使用右参数的低位5位与使用模32的参数(使用数学定义,使得-1 mod 32 == 31,-2 mod 32 == 30等)相同。 )。

类似地,x >> 2是64位,这意味着右参数是以64为模计算的,这与仅使用右参数的低6位相同。

为什么Java会这样做,我不知道。在我看来,它会更加一致,如果它只是让你移动大量,将所有位移出整数并导致0(除了long符号扩展,所以结果将是0或-1)。它在数学上是一致的,因为对于正>>xy总是等于x >> y被截断为整数,即使x / (2^y)> ; = 32.Java处理> = 32或> = 64的移位量的方式对我能看到的任何方式都没有用。

答案 1 :(得分:3)

转换操作的结果被解释为intlong,具体取决于左侧

int(32位)左侧为int或更低(8位byte,16位char,16位short)< / p> 当左侧是long

时,

long(64位)

为了将结果限制在这些范围内,必须以下列方式限制右侧

  

仅使用右侧的五个低位。

不允许轮班超过31(%0001 1111)

  

仅使用右侧的六个低位。

不允许轮班超过63(%0011 1111)

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

答案 2 :(得分:1)

他指的是你移位的数字所使用的比特数,所以对于一个int,右边的&#34;五个低阶位&#34;给你5位= 2 ^ 5 = 32位,你可以移位。类似地,六位= 2 ^ 6 = 64,因此您只能将长位移64位。请注意,这些数字分别对应于int和long的大小。