有一些特殊格式(base-128)设计用于传输 protobufs 中使用的整数。和 elsewhere 。当大多数整数都很小时,它们是有利的(它们需要一个字节来表示最小的数字,并且可能会浪费一个字节来表示其他数字)。
我想知道 float 是否有类似的东西,假设它们中的大多数实际上是小整数?
<小时/>针对爱丽丝的回答:我正在考虑类似的事情
void putCompressedDouble(double x) {
int n = (int) x;
boolean fits = (n == x);
putBoolean(fits);
if (fits) {
putCompressedInt(n);
} else {
putUncompressedLong(Double.doubleToLongBits(x));
}
}
这可行(除了负零,我真的不关心),但在 fits == true
的情况下这是浪费的。
最佳答案
这取决于你的号码分布。大小实际上并不那么重要,因为它是通过 float 的指数域表示的。通常尾数在存储方面贡献最大的“权重”。
如果您的 float 主要是整数,则可以通过转换为 int(通过 Float.floatToIntBits())并检查有多少个尾随零(对于较小的 int 值,最多应有 23 个尾随零)来获得一些 yield 。当使用简单的方案对小整数进行编码时,您可以简单地实现编码 float :
int raw = Float.floatToIntBits(f);
raw = Integer.reverse(raw);
encodeAsInt(raw);
(解码只是简单地反转该过程)。 其作用只是将尾数中的尾随零移动到 int 表示的最高有效位,这对于为小整数设计的编码方案很友好。
同样适用于 double<->long。
关于java - float 的紧凑格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21409752/