Java中的右移操作

3

我卡在了一个小逻辑上,一直没能搞对。

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
一个正常的编译器应该会警告你。 - devnull
2个回答

7
当您对一个int进行移位时,只使用移位的低5位。当您对一个long进行移位时,只使用最低的6位。
Java语言规范第15.19节
如果左操作数的提升类型为int,则仅使用右操作数的五个最低有效位作为移位距离。就好像右操作数被位逻辑AND运算符& (§15.22.1)与掩码值0x1f (0b11111)相结合。因此实际使用的移位距离始终在0到31之间(包括0和31)。
如果左操作数的提升类型为long,则仅使用右操作数的六个最低有效位作为移位距离。就好像右操作数被位逻辑AND运算符& (§15.22.1)与掩码值0x3f (0b111111)相结合。因此实际使用的移位距离始终在0到63之间(包括0和63)。

2
虽然这是正确的,但最好能够更详细地解释一下。这个答案试图表达的意思是,由于32在位表示中是100000,最后5位是00000,代表着0,因此不会进行任何位移。对于long类型,对于641000000)及其乘法运算也不会发生位移。 - Pshemo

6

JLS 15.19. 移位运算符

如果左操作数的提升类型为int,则右操作数的五个最低有效位作为移位距离。就好像右操作数受到位逻辑与运算符&(§15.22.1)与掩码值0x1f (0b11111)的影响一样。实际使用的移位距离因此总是在0到31范围内,包括边界。

如果左操作数的提升类型为long,则右操作数的六个最低有效位作为移位距离。就好像右操作数受到位逻辑与运算符&(§15.22.1)与掩码值0x3f (0b111111)的影响一样。实际使用的移位距离因此总是在0到63范围内,包括边界。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接