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