10

我遇到了一个有趣的场景,当使用按位移位运算符时。如果第二个操作数是负数,按位移位操作是如何工作的?.

即 a << b ,"<<" 将 a 中的位模式向左移动 b 位。但是如果 b 是消极的,它不应该是运行时的错误吗?

我能够成功运行以下代码,但我不明白它是如何工作的?

 public static void bitwiseleftShift(char testChar)
{
    int val=testChar-'a';
    int result= 1<<val;
    System.out.println("bit wise shift of 1 with val="+val+" is "+result);
}

输入

   bitwiseleftShift('A');// ASCII 65
   bitwiseleftShift('0'); // ASCII 48 

结果

   bit wise shift of 1 with val=-32 is 1
   bit wise shift of 1 with val=-49 is 32768

'a' 的 ASCII 是 97。有人可以帮我理解它是如何工作的吗?

4

1 回答 1

9

但是如果 b 是消极的,那么它在运行时不应该是一个错误吗?

不根据 Java 语言规范,第 15.19 节

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

因此,-32 的移位实际上以 0 的移位结束,-49 的移位实际上以 15 的移位结束——因此您看到了结果。

于 2013-03-24T20:05:39.807 回答