在Java中的右移

时间:2014-03-08 09:03:02

标签: java digital-logic

我只是坚持这个小逻辑,我没有做对

int是32位,所以假设在二进制中取20就像

// 00000000000000000000000000010100    

..现在如果我执行右移操作说4

int a = 20>>4;   
// 00000000000000000000000000000001    

..所以结果是1

现在说我再次拿20并做5次右移操作

int b = 20>>5;  //00000000000000000000000000000000    

..所以结果是0

现在,如果我做了32次右移......为什么我得到的数字与我指定的相同。??

int c = 20>>32; //how does this prints 20 again??

System.out.println("right shift 4= "+a+"\n right shift 5= "+b+"right shift 32 = "+c);

所以我期待的是在5班之后。任何班次应该导致结果为0 ..但是在32班次为什么我要回到指定值?

2 个答案:

答案 0 :(得分:7)

当您移动int时,仅使用移位的低5位。当您移动long时,仅使用最低的6位。

来自Java Language Specification section 15.19

  

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

     

如果左侧操作数的提升类型很长,那么只有   右手操作数的六个最低位用作移位   距离。好像右手操作数受到了a   按位逻辑AND运算符& (§15.22.1),掩码值为0x3f   (0b111111)。 因此实际使用的换档距离始终为   范围0到63,包括在内。

答案 1 :(得分:6)

JLS 15.19。移位运算符

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

如果左侧操作数的提升类型很长,则只使用右侧操作数的六个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符& (§15.22.1),掩码值为0x3f(0b111111)。因此,实际使用的移位距离始终在0到63的范围内,包括