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

Java 右逻辑/无符号移位为符号位插入1而不是0,java,bit-manipulation,bit-shift,Java,Bit Manipulation,Bit Shift,我正在处理从CCS转换浮点数的问题,CCS不遵循IEEE标准(不是符号位、指数、尾数,而是使用指数、符号位、尾数);我在使用>>操作符时遇到了一些奇怪的行为 给定 既然>>指定它将插入0,为什么我会得到1 我可以编写代码并手动翻转位,但我不想最终发现它是特定于平台的。您使用的是整数,而不是字节。int值必须比要移入的第8位多1位。不要使用字节,请使用int。但是,运行以下代码: int int1 = 0x8A; System.out.println(formatBinary(in

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

给定

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


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

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

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

    int int1 = 0x8A;
    System.out.println(formatBinary(int1));
    int int2 = int1 >>> 1;
    System.out.println(formatBinary(int2));
获取此输出(使用名为formatBinary的格式化打印方法,该方法不相关):


在java中,字节在移位操作之前自动转换为整数。密码学上,你所做的等同于:

byte byte2=(byte)(((int)byte1)>>>1);
当然,对int符号的强制转换也会扩展。如果将结果保留为整数,则会看到(然后)预期值0x7FFFFFC5

为了避免这个问题,只需将第8位的部分遮住

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


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

删除了
int
所有
byte
s。结果仍然一样。无论如何,位移位似乎返回一个
int
,因此我必须将其转换为
字节
。在一个数字告诉JVM它是一个十六进制值之前添加
0x
(在本例中是do
0x8A
),这比
byte.decode
:)编辑:事实上,byte.decode在那里不起作用…@AlexColeman-true,这是一点。在本例中,我实际上并没有这样做,只是出于示例的目的使用它。我正在接收的实
字节
中已经有
8A
。谢谢。你也必须转换成字节(它是一个int);)但是好的
byte byte2=(byte)(((int)byte1)>>>1);
byte byte2 = (byte) (byte1 >>> 1 & 0x7F);