按位运算符左移

时间:2016-03-06 01:54:44

标签: java bitwise-operators

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

2 个答案:

答案 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

答案 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)