右逻辑/无符号移位插入 1 而不是 0 作为符号位



我正在处理从 CCS 转换浮点数,它不遵循 IEEE 标准(而不是符号位、指数、尾数,他们使用指数、符号位、尾数);我在使用 >>> 运算符时遇到了一些奇怪的行为。

鉴于

byte byte1=(byte)0x8A;     //10001010
byte byte2=(byte)(byte1>>>1);       //11000101

既然>>>指定它会插入一个0,为什么我会得到一个1

我可以围绕此问题编写代码并手动翻转位,但我不想最终发现它是特定于平台的。

在 java 中,字节在移位操作之前自动转换为整数。 从逻辑上讲,你正在做的事情相当于:

byte byte2=(byte)(((int)byte1)>>>1);

而且,当然,投射到 int 符号会扩展。 如果将结果保留为整数,您将看到(当时)预期值 0x7FFFFFC5。

要解决此问题,只需屏蔽第 8 位平坦。

byte byte2 = (byte) (byte1 >>> 1 & 0x7F);

相关问题

这种行为不是明智和预期的,Java不是很好吗?

不要使用字节,坚持使用 int。但是,运行以下代码:

    int int1 = 0x8A;
    System.out.println(formatBinary(int1));
    int int2 = int1 >>> 1;
    System.out.println(formatBinary(int2));

给我这个输出(使用一种称为 formatBinary 的格式化打印方法,这是不相关的):

8a: 10001010
45: 01000101

你使用的是整数,而不是字节。 int值必须比您要移入的第 8 位多 1 位。

最新更新