在我的Java应用程序中,我需要解释32位不动点值.数字格式如下:前15位描述逗号/点之前的位置,第16位表示值的符号,后面的16位描述小数位(1/2,1/4,1/8) 1/16,...).
输入是一个包含四个值的字节数组.字节数组中位的顺序是小端.
我怎样才能将这样的数字转换成Java float?
只是按照它说的做.假设x是32位定点数int.
所以,把点放在点之后,点之后,不要在这里使用符号:
float f = (float)(x & 0x7fff_ffff) / (float)(1 << 16);
Run Code Online (Sandbox Code Playgroud)
放回标志:
return x < 0 ? -f : f;
Run Code Online (Sandbox Code Playgroud)
你会失去一些精确度.A float没有31位精度,但输入确实如此.虽然它很容易适应double.
由于符号位显然位于中间位置,因此首先将其取出:
int sign = x & (1 << 16);
Run Code Online (Sandbox Code Playgroud)
加入两行非符号位:
x = (x & 0xFFFF) | ((x >> 1) & 0x7fff0000);
Run Code Online (Sandbox Code Playgroud)
然后或多或少做旧事:
float f = (float)x / (float)(1 << 16);
return sign == 0 ? f : -f;
Run Code Online (Sandbox Code Playgroud)
如果您的输入是小端格式,请使用以下方法生成x:
int x = ByteBuffer.wrap(weirdFixedPoint).order(ByteOrder.LITTLE_ENDIAN).getInt();
Run Code Online (Sandbox Code Playgroud)
哪里weirdFixedPoint是包含32位二进制表示的字节数组.