在Java中的右移

Muk*_*ngh 3 java digital-logic

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

int 是32位所以假设二进制20就像

// 00000000000000000000000000010100    
Run Code Online (Sandbox Code Playgroud)

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

int a = 20>>4;   
// 00000000000000000000000000000001    
Run Code Online (Sandbox Code Playgroud)

..结果是1

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

int b = 20>>5;  //00000000000000000000000000000000    
Run Code Online (Sandbox Code Playgroud)

..结果是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);
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*rey 7

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

Java语言规范部分15.19:

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

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

  • 虽然这是真的,但更好地解释它会更好.这个答案试图说的是,由于32位表示为"100000",最后5位为"00000",表示"0",因此不会有位移.对于`long`类型,`64`(`1000000`)及其乘法不会发生移位. (2认同)

Evg*_*eev 6

JLS 15.19.移位运算符

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

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