我一直在尝试理解一个示例 inflate 实现,这有点令人困惑:
static int decode(struct state *s, struct huffman *h)
{
int len; /* current number of bits in code */
int code; /* len bits being decoded */
int first; /* first code of length len */
int count; /* number of codes of length len */
int index; /* index of first code of length len in symbol table */
code = first = index = 0;
for (len = 1; len <= MAXBITS; len++) {
code |= bits(s, 1); /* get next bit */
count = h->count[len];
if (code - count < first) /* if length len, return symbol */
return h->symbol[index + (code - first)];
index += count; /* else update for next length */
first += count;
first <<= 1;
code <<= 1;
}
return -10; /* ran out of codes */
}
特别是这部分:
first += count;
first <<= 1;
有人能解释一下位移或乘以常数是如何产生特定代码长度的实际第一个代码的吗?基本上,第一个代码的索引和实际的第一个代码之间的差异是“2倍”?
为简单起见,只需考虑它从 7 位长度滚动到 8 位长度,其中 7 产生第一个非零计数,在固定版本中将是 24,我猜因为间隔是 [256, 280>。
我的假设是它保留了代码和下一个长度的第一个之间的数量级,因为它们的减法关系比确定符号偏移的绝对值更相关 - 但是 - 我不太确定是这种情况.