通过负数移位的位智能移位运算符

pra*_*ari 10 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);
}
Run Code Online (Sandbox Code Playgroud)

输入

   bitwiseleftShift('A');// ASCII 65
   bitwiseleftShift('0'); // ASCII 48 
Run Code Online (Sandbox Code Playgroud)

结果

   bit wise shift of 1 with val=-32 is 1
   bit wise shift of 1 with val=-49 is 32768
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 9

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

不符合Java语言规范第15.19节:

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

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