【问题标题】:Value range of unsigned qword (64-Bits) using less bits?使用较少位的无符号 qword(64 位)的值范围?
【发布时间】:2017-04-21 22:22:22
【问题描述】:

我正在寻找一种表示值范围的方法: 0 - 18446744073709551615 使用少于 8 个字节。

我试图想一些方法可以做到,但没有任何效果。 理论上,例如: 使用单个字节来表示至少 2 个字节的位序列。 但是,2 个字节有 65536 种不同的位组合,而单个字节只给了我们 0-255 的取值范围(256 种组合)。

最好的方法可能是改变位的含义。这很好,但不会有任何精度损失。

我开始认为这根本不可能,尽管我想获得其他人关于该主题的意见和理论。

有两条规则: #1 不能有任何精度损失(即所有数字 0 - 18446744073709551615 必须是可表示的)。 #2 从标准 64 位格式转换后,需要的字节数永远不会超过 7 个字节(56 位)。

这些规则使这变得特别困难。

【问题讨论】:

  • 如果所有 2^64 数字都必须是可表示的,那么你就完成了。 63位只能代表其中的一半。如果将所有 63 位压缩值解压缩,最多将得到 64 位值的一半。简单计数。 56 位只能表示数字的 1/256。你需要64位。期间。

标签: c++ assembly binary compression number-theory


【解决方案1】:

这些规则使这变得特别困难。

是的,很难证明是不可能的。

如果您可以为每个可能的 64b 值无损压缩 8 个字节到小于 8 个字节,您可以继续重复该过程,直到您的 1TB 文件约为 7 个字节。

还有很多其他的信息论论据说明为什么这是不可能的。例如鸽巢原则:n 位只有 2^n 个唯一的位模式,因此任何小于 64 位的东西都不能对每个可能的 64 位值都有唯一的表示。


您可以有用的是Huffman coding 或类似的:如果某些 64b 值比其他值更常见,则不太复杂的可变长度编码方案可以节省总字节数。 但要使用可变长度编码方案表示所有 64b 值,某些值的编码将占用超过 8 个字节。

存在更高级的熵编码方法,并用于现代视频编解码器。 (例如 x264 的 CABAC)。


更多理论,维基百科的无损压缩文章有一个Limitations section

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2019-07-11
    • 2016-04-19
    相关资源
    最近更新 更多