2016-03-06 144 views
-2

我对位运算符感到困惑。每当我做99(0110 0011)< < 2,答案是396.我对左移的理解是在右侧添加两个0。所以我的答案是140(1000 1100)而不是396.为什么Java中的答案是396?按位运算符左移

+0

通过“添加两个零”,它实际上将二进制向左移两次,因此是操作符的名称。对于小整数,数字不会从左侧落下 –

回答

0

由于Java int是带符号的32位数量(不是8位),向左按位移2(<< 2)与* 4相同。你可以看到这个像

int i = 99; 
System.out.printf(" %s (%d)%n", Integer.toBinaryString(i), i); 
i <<= 2; 
System.out.printf("%s (%d)%n", Integer.toBinaryString(i), i); 

输出是

1100011 (99) 
110001100 (396) 
+0

感谢您的回复。它现在很有意义。 :) –

1

你只示出8位,但一个int为32位。

byte 8 bits 
short 16 bits 
int 32 bits 
long 64 bits 

在Java中整数计算被强制为intlong,所以即使你的99价值一个byte((byte)99) << 2结果仍然是一个int

       0110 0011 = 99 (byte) 
0000 0000 0000 0000 0000 0001 1000 1100 = 396 (int) 

现在,你可以随时将它转换回一个byte,这将放弃所有高序位:

(byte)(99 << 2) = (byte)0b10001100 = (byte)0x8C = -116 

或者你可以丢弃的高位,同时保持它的int

(99 << 2) & 0xFF = 0b10001100 = 0x0000008C = 140 
+0

哦!这更有意义!谢谢! :) –

+0

@JonathanNelsonCastillo如果这是您正在寻找的答案,请点击对号接受答案,以便其他人可以看到您的问题已得到充分解答。 – Andreas