我有两个字节:
byte[0]
是0000 0000
byte[1]
是1000 0000
我想将它们组合在一起并制作一个浮点值。所以结果应该是128是十进制和0000 0000 1000 0000二进制。由于领先的零而不是负面的。
到目前为止我的解决方案是这种方法:
float f = (bytes[0] << 8 | bytes[1]);
但是这将导致值f的值减去128。这是因为2s补码我猜。因此byte[1]
将被解释为否定。我怎样才能看到byte[0]
的前导位为负/正位?
答案 0 :(得分:3)
由于您正在执行一些扩展转换,因此必须停止前导1位的传播,因为内部使用了两个补码:
byte[] bytes = {0, -128}; // bytes[0] = 0000 0000, bytes[1] = 1000 0000
short s = (short) (((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF));
System.out.println(s); // prints 128
此外,float
用于浮点数,因为您需要16位十进制数,我将目标数据类型更改为short
。
答案 1 :(得分:3)
试试这个:
short int16 = (short)(((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF));
由于操作优先级,您需要使用括号。
一旦得到16位整数,就可以将它分配给你的浮点数:
float f = int16;
是的,你可以一步完成,但我想一步一步走。