我正在处理从不遵循 IEEE 标准的 CCS 转换浮点数(而不是符号位、指数、尾数,他们使用指数、符号位、尾数);我在使用>>>
运算符时遇到了一些奇怪的行为。
给定
byte byte1=(byte)0x8A; //10001010
byte byte2=(byte)(byte1>>>1); //11000101
既然>>>
指定它将插入 a 0
,为什么我会得到 a 1
?
我可以围绕这个编写代码并手动翻转位,但我不想最终发现它是特定于平台的。
我正在处理从不遵循 IEEE 标准的 CCS 转换浮点数(而不是符号位、指数、尾数,他们使用指数、符号位、尾数);我在使用>>>
运算符时遇到了一些奇怪的行为。
给定
byte byte1=(byte)0x8A; //10001010
byte byte2=(byte)(byte1>>>1); //11000101
既然>>>
指定它将插入 a 0
,为什么我会得到 a 1
?
我可以围绕这个编写代码并手动翻转位,但我不想最终发现它是特定于平台的。
在 Java 中,字节在移位操作之前自动转换为整数。Codologically,你在做什么相当于:
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 位。