我对按位运算符感到困惑。每当我做99(0110 0011)<< 2,答案是396.我对左移的理解是在右侧增加两个0。所以我的答案是140(1000 1100)而不是396.为什么答案396为99<< Java中的2?
答案 0 :(得分:1)
您只显示8位,但int
为32位。
byte 8 bits
short 16 bits
int 32 bits
long 64 bits
Java中的整数计算被强制转换为int
或long
,因此即使您的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
答案 1 :(得分: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)