按位移位运算符,负数移位

时间:2013-03-24 20:02:09

标签: java bit-manipulation

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

即a<< b,“<<”将位模式向左移位a中的b位。但是如果b是neagtive,那么它不应该在运行时出错吗?

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

 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.有人可以帮我理解这是如何工作的吗?

1 个答案:

答案 0 :(得分:9)

  

但如果b是neagtive,那么在运行时不应该是错误吗?

不符合Java语言规范section 15.19

  

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

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