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 个班次时,为什么我要取回分配的值?

4

2 回答 2

7

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

Java 语言规范第 15.19 节

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

如果左手操作数的提升类型是长的,那么只有右手操作数的六个最低位用作移位距离。就好像右手操作数经过位逻辑与运算符 & (§15.22.1) 与掩码值 0x3f (0b111111)。因此,实际使用的移位距离总是在 0 到 63 的范围内,包括 0 到 63。

于 2014-03-08T09:05:45.503 回答
6

JLS 15.19。移位运算符

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

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

于 2014-03-08T09:17:24.233 回答