转换 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 位精度,但您的输入有。不过,它很容易适应 double
s。
由于符号位明显在中间,所以先把它弄出来:
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 位定点值。数字格式如下:前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 位精度,但您的输入有。不过,它很容易适应 double
s。
由于符号位明显在中间,所以先把它弄出来:
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 位二进制表示的字节数组。