按位运算符左移



我对按位运算符感到困惑。每当我做 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中的整数计算是强制intlong,所以即使你的99byte((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)

最新更新