在我的 Java 应用程序中,我需要解释一个 32 位定点值。数字格式如下:前 15 位描述逗号/点之前的位置,第 16 位表示值的符号,后面的 16 位描述小数位(1/2、1/4、1/8、1/16、...)。
输入是一个有四个值的字节数组。字节数组中的位顺序是小端。
如何将这样的数字转换为 Java float
?
最佳答案
按照上面说的去做。假设x
是int
的32位定点数。
所以,把位放在点之后,点之后,不要在这里使用符号:
float f = (float)(x & 0x7fff_ffff) / (float)(1 << 16);
放回标志:
return x < 0 ? -f : f;
你会失去一些精度。 float
没有 31 位精度,但您的输入有。不过,它很容易适应 double
。
由于符号位显然真的在中间,所以先把它拿出来:
int sign = x & (1 << 16);
加入两轮非符号位:
x = (x & 0xFFFF) | ((x >> 1) & 0x7fff0000);
然后或多或少地做旧事:
float f = (float)x / (float)(1 << 16);
return sign == 0 ? f : -f;
如果您的输入是小端格式,请使用以下方法生成 x
:
int x = ByteBuffer.wrap(weirdFixedPoint).order(ByteOrder.LITTLE_ENDIAN).getInt();
其中 weirdFixedPoint
是包含 32 位二进制表示的字节数组。
关于java - 转换 32 位定点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323298/