我遇到了一个有趣的场景,当使用按位移位运算符时。如果第二个操作数为负数,则按位移位操作如何工作? 。
即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.有人可以帮我理解这是如何工作的吗?
答案 0 :(得分:9)
但如果b是neagtive,那么在运行时不应该是错误吗?
不符合Java语言规范section 15.19:
如果左侧操作数的提升类型为int,则只使用右侧操作数的五个最低位作为移位距离。就好像右手操作数受到按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f(0b11111)。因此,实际使用的移动距离始终在0到31的范围内,包括0和31。
因此,-32的移位实际上以0的移位结束,-49的移位实际上以15的移位结束 - 因此您看到了结果。