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