我正在处理从 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 位。