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

时间:2016-12-07 04:45:39

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

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

我曾试图想办法,但没有办法。 理论上,例如: 使用单个字节表示至少2个字节的位序列。 但是,2个字节有65536个不同的位组合,而单个字节只给我们一个0-255(256个组合)的值范围。

最好的方法可能是改变位的含义。那没关系,但不能精确损失。

我开始认为这根本不可能,但我希望得到其他人关于这个主题的意见和理论。

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

这些规则使得这一点特别困难。

1 个答案:

答案 0 :(得分:8)

  

这些规则使得这一点特别困难。

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

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

还有很多其他的信息理论论据,为什么这是不可能的。例如鸽笼原则:public class TestProblem3{ public static void main(String[] args){ testMin(); } public static void testMin(){ int[] data = {1,2,3,4,5}; int minValue = Problem3.min(data); if( minValue != 1 ) System.err.println("FAILURE expected 1, but actual value is "+minValue); data = new int[]{-1,2,3,4,5}; minValue = Problem3.min(data); if( minValue != -1 ) System.err.println("FAILURE expected -1, but actual value is "+minValue); //More tests here! } //More test methods here! } 位只有2 ^ n个唯一的位模式,因此任何小于64位的内容都不能为每个可能的64位值提供唯一的表示。

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

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

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

另见: