c++ - 使用较少位的无符号 qword(64 位)的值范围?

标签 c++ assembly binary compression number-theory

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

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

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

我开始认为这根本不可能,尽管我想听听其他人对这个问题的看法和理论。

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

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

最佳答案

these rules make this particularly hard.

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

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

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


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

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


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

另见:

关于c++ - 使用较少位的无符号 qword(64 位)的值范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41009595/

相关文章:

c++ - 在 C++ 模板代码中找不到构造函数

debugging - 在 x32dbg/x64dbg 中,我如何自动跟踪 'dump window' 中的堆栈(ESP)?

assembly - 为什么 Clang 在将 double 转换为 ulonglong 时调用 %eip+1?

c++ - !编译器只留下一个 stub ! ,C++, 在.o文件中找到这些 "stubs"

c++ - 这个 bin-to-dec 代码有什么问题?

索引数组的 C++ 二进制值

c++ - 字符串数组,我该如何使用它?执行

c++ - 重载运算符返回类型

c++ - 在默认构造函数中初始化 vector 变量?

java - 灰度到二进制?