为什么11010100 << 1 等于110101000,而不是 10101000?

2022-09-01 02:26:01

为什么当我尝试为110101002移动位时,结果是1101010002,而不是101010002

int a = Integer.parseInt("11010100", 2) << 1;

我尝试这样做:

int a = (byte)(Integer.parseInt("11010100", 2) << 1);

但是,如果输出值大于128,则一切都变为负数,这是合乎逻辑的。我怎样才能使位数不变?


答案 1

让我们一步一步来。

  1. Integer.parseInt("11010100", 2)- 这是整数值 212。顺便说一句,这是不必要的。你可以直接写:.0b11010100

  2. 0b11010100 << 1与 相同,为 424。0b110101000

  3. 然后将其转换为字节:。超过前 8 个位的位全部脱落,留下 0b10101000,即 -88。减号,是的,因为在java中字节是有符号的。(byte)(0b11010100 << 1)

  4. 然后,在将此 -88 赋值到 int 值时,静默地将其转换回 int。它仍然是-88,这意味着所有顶部位都是1。

因此,最终值为 。-88

如果你想看到(这是完全相同的位,但显示无符号而不是有符号),通常的技巧是使用 ,它将除前8位以外的所有位设置为0,从而保证一个正数:168& 0xFF

byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.

// or in one go:

System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168


答案 2

如果要将比底部 8 位高的所有位都设置为 0,则可以使用按位 AND:

int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));

输出:

10101000

推荐