gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:41:28 25 4
gpt4 key购买 nike

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

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

我尝试这样做:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);

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

最佳答案

让我们一步一步来。

  • Integer.parseInt("11010100", 2) - 这是 int 值 212。顺便说一下,这是不必要的;你可以写:0b11010100 .
  • 0b11010100 << 10b110101000 相同,并且是 424。
  • 然后将其转换为一个字节:(byte)(0b11010100 << 1) .前 8 位以外的位都被砍掉,剩下 0b10101000,即 -88。减去,是的,因为在 Java 字节中是有符号的。
  • 然后,当您将它分配给一个 int 值时,您悄悄地将这个 -88 转换回 int。它仍然是 -88,这意味着所有的最高位都是 1。

  • 因此,最终值是 -88 .

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

    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

    关于java - 为什么 11010100 << 1 等于 110101000,而不是 10101000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60321560/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com