Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 实现动态位域_Algorithm_Encoding_Compression_Decoding_Bit Fields - Fatal编程技术网

Algorithm 实现动态位域

Algorithm 实现动态位域,algorithm,encoding,compression,decoding,bit-fields,Algorithm,Encoding,Compression,Decoding,Bit Fields,关键是以下问题可能会发生什么。 -int数组的元素,比如说5,5,6,7,9位长(它们是不同的) 如何对其进行编码,使其使用32位而不是通常的160位 我还想说,在另一方面(解码方面),我不知道每个元素有多大。那么,如果我收到这样的数据,我怎么可能解码,或者换句话说,我怎么能够以一种容易解码的方式开始编码呢 根据元素的最大大小,可以在包含元素大小(以位为单位)的每个元素之前包含4-6位(如果最大大小

关键是以下问题可能会发生什么。

-int数组的元素,比如说5,5,6,7,9位长(它们是不同的)

如何对其进行编码,使其使用32位而不是通常的160位


我还想说,在另一方面(解码方面),我不知道每个元素有多大。那么,如果我收到这样的数据,我怎么可能解码,或者换句话说,我怎么能够以一种容易解码的方式开始编码呢

根据元素的最大大小,可以在包含元素大小(以位为单位)的每个元素之前包含4-6位(如果最大大小<16,则为4位;如果最大大小<32,则为5位;如果最大大小<64,则为6位)

解码将非常简单:

  • 读取4位以确定元素大小
  • 读取x位作为元素(其中x为元素大小)

由于大小可变,您将无法将数据打包到32字节,因为您需要为每个元素包含某种大小指示符。在这种情况下,假设你使用4位的大小,你将使用52位,这只是原始大小的160位的32.5%。

< P>如果事先知道这些数字中的位的分布,那么很简单:把数组中的每个元素的位放在结果int中的适当位置,像这样(例如在C++代码中):

如果比特长度事先不知道,唯一已知的事实是,它们的比特大小加起来是32,那么在一般情况下,不可能将它们编码为最多32位;因为您已经需要这个数量的位来存储实际的数字;但是你也必须知道编码数字的比特长度;为此,您需要额外的存储空间。只要这些数字不是多余的,并且可以压缩,这一切都是有效的

当然,有一些方法可以使其小于每个整数4个字节;根据要处理的数字的确切属性,一种或另一种算法可能更适合;以下是一些可能的算法的简短列表:

  • 如果您知道整数的最大长度为9位,则可以使用上面所示的简单方法,但偏移量为9来存储数字;使用此方法,5个值的位数将降至45位
  • 在每个元素之前有一个长度指示器是另一种可能性(如所建议的)
  • 另一个是在(使用)中提出的
  • 你也可以使用

前两种方法的缺点是它们只能表示固定的最大位数。这种处理属于压缩领域,为了进行更多的理论分析,请务必阅读有关该主题的一些文献;正如卡加纳尔在评论中指出的那样,这里特别感兴趣的是:;上面列表中的最后两个算法就是这样的通用代码。对于5、5、6、7和9位的5个值的示例输入,它们应该将您的输入降到48位(对于小于8位的4个值,4乘以8位,对于9位数字,1乘以16位)。与列表中的其他方法相比,这两种方法的优点是它们适用于任意大的数字;可能还有其他更适合您的通用代码,请务必查看其他代码。

我认为将5、5、6、7、9压缩为32位是不可能的。存储空间太小,无法容纳所有信息

首先,我们可以通过观察元素的最大可能位来最小化填充位。如果我们对最大10位元素使用32位变量,我们将浪费22位。对于10位数据类型,每个元素可以去掉22位


除此之外,还需要一些充气、放气方案,我认为它不适合像OP的例子那样的小数据或数字数组。

如果您还描述了上下文或问题,您将在哪里应用此方案,您可以得到更有用的回答。我没有时间给出正确的答案,但这是一个经过充分研究的问题。通过谷歌查看“通用代码”。
unsigned int encoded = (val[0]) | (val[1] << 5) | (val[2] << 10) |
              (val[3] << 16) | (val[4] << 23);
int decoded[5];
decoded[0] = encoded & 0x1F;
decoded[1] = (encoded >> 5) & 0x1F;
decoded[2] = (encoded >> 10) & 0x3F;
decoded[3] = (encoded >> 16) & 0x7F;
decoded[4] = (encoded >> 23);