java - 转换 32 位定点值

标签 java fixed-point

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

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

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

最佳答案

按照上面说的去做。假设xint的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/

相关文章:

c - 有符号和无符号整数乘法

java - Android - 创建同步计时器

java - java.lang.Math.max(int a, int b) 线程安全吗?

c++ - 如何提高小值的定点平方根

c - 为什么我的定点转换对于负非整数会减去 1?

c# - .NET 十进制格式根据源的不同而不同

java - JSP 唯一的应用可能性

java - Hadoop 2.7.3中的HTrace

java - Hibernate 父类(super class)中带有 @OneToOne 注释的字段

c++ - 从不动点计算平方根