转换 32 位定点值

Convert 32 bit fixed point value

在我的 Java 应用程序中,我需要解释一个 32 位定点值。数字格式如下:前15位表示comma/point前的位置,第16位表示符号 value 和后面的 16 位描述了小数位 (1/2,1/4,1/8,1/16,...)。

输入是一个有四个值的字节数组。字节数组中的位顺序是 little endian.

如何将这样的数字转换为 Java float

按照上面说的去做。假设 x 是 32 位定点数 int.

所以,把位放在点之后,点之后,不要在这里使用符号:

float f = (float)(x & 0x7fff_ffff) / (float)(1 << 16);

放回标志:

return x < 0 ? -f : f;

你会失去一些精度。 float 没有 31 位精度,但您的输入有。不过,它很容易适应 doubles。


由于符号位明显在中间,所以先把它弄出来:

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 位二进制表示的字节数组。