Alw*_*Nub 1 c++ compression binary assembly number-theory
我正在寻找一种方法来表示值范围:0 - 18446744073709551615使用少于8个字节.
我试着想一些可以做到的方法,但没有任何作用.理论上,例如:使用单个字节表示至少2个字节的位序列.但是,2个字节具有65536个不同的位组合,而单个字节仅给出0-255(256个组合)的值范围.
最好的方法可能是改变位的含义.那没关系,但不能有任何精确损失.
我开始认为它根本不可能,但我希望得到其他人关于这个问题的意见和理论.
有两个规则:#1不能有任何精度损失(即,所有数字0 - 18446744073709551615必须是可表示的).#2从标准64位格式转换永远不会导致需要超过7个字节(56位).
这些规则使这一点特别困难.
这些规则使这一点特别困难.
是的,难以证明是不可能的.
如果您可以为每个可能的64b值无损地压缩8个字节到小于8个字节,则可以继续重复该过程,直到1TB文件大约为7个字节.
还有很多其他的信息论论证为什么这是不可能的.例如,鸽笼原理:n比特仅具有2 ^ n个唯一的比特模式,因此任何小于64比特的比特都不能对每个可能的64比特值具有唯一的表示.
您可以使用的是霍夫曼编码或类似的:如果某些64b值比其他值更常见,则不太复杂的可变长度编码方案可以节省总字节数. 但是,对于可用可变长度编码方案表示的所有64b值,某些值的编码将花费超过8个字节.
存在更高级的熵编码方法,并且在现代视频编解码器中使用.(例如x264的CABAC).
对于更多理论,维基百科的无损压缩文章有一个限制部分.
也可以看看: