由负数转变逐位移位运算符(Bit wise shift operator with shift by

2019-07-23 02:44发布

我碰到一个有趣的场景,当按位移位运算工作。 如果第二个操作数是负的,怎么做的按位移位运算的作品? 。

即<< B,“<<”在一个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

ASCII的“一”是97。有人可以帮助我理解它是如何工作的?

Answer 1:

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

根据Java语言规范中没有, 部分15.19 :

如果左边的操作数的提升的类型为int,只有右边的操作数的五个最低阶位被用作移位距离。 这是因为如果在右边的操作数进行逐位与掩模值0x1F的(0b11111)逻辑AND运算符&(§15.22.1)。 实际使用的移位距离因此总是在范围为0〜31,包括端值。

所以-32的转变实际上结束了为0的转变,以及-49的转变实际上为15移位结束了 - 因此你看到的结果。



文章来源: Bit wise shift operator with shift by negative number