2

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

给定

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

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

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

4

3 回答 3

2

在 Java 中,字节在移位操作之前自动转换为整数。Codologically,你在做什么相当于:

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

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

为了解决这个问题,只需将第 8 位屏蔽。

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

相关问题

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

于 2012-10-02T21:09:51.953 回答
1

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

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

让我得到这个输出(使用名为 formatBinary 的格式化打印方法,这是无关的):

8a: 10001010
45: 01000101
于 2012-10-02T21:09:25.947 回答
0

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

于 2012-10-02T20:50:32.063 回答