2013-03-24 78 views
10

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

即即< < 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 

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

回答

9

但是,如果b是混淆的,它不应该是运行时的错误吗?

不根据Java语言规范,section 15.19

如果左边的操作数的提升的类型为int,只有右边的操作数的五个最低阶位被用作作为移位距离。就好像右侧的操作数受掩码值0x1f(0b11111)的按位逻辑AND运算符&(第15.22.1节)的处理。实际使用的换档距离总是在0到31的范围内。

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

+0

谢谢John!这就是答案..所以说我不能接受答案,直到6分钟... :(顺便说一句,大粉丝!很高兴你回答! – prashantsunkari 2013-03-24 20:11:12