自适应算术编码整数移位实现为何输出字符的技术疑问
关于自适应算术编码整数实现中输出字符的疑问
我正在研究CodeAbbey上的自适应算术编码实现,我的理解是:用浮点精度实现时,压缩结果是一个浮点值;用整数移位模拟无限精度时,输出应该是二进制值。但这个实现里有这么个函数:
def remove_first_digit(v): # returns truncated value and digit which was truncated d = v // tail v %= tail return v, d
变量d会被追加到输出output作为压缩结果,但这里的d最终是char类型。我搞不懂这个实现的逻辑,为什么要转成char类型?
这是因为这个实现用的是十进制整数编码,而非常规的二进制整数编码。
通常我们说的整数移位式算术编码,大多基于二进制逻辑——每次缩放区间后输出最高位的二进制位,再通过移位补零维持区间范围。但这个实现换了思路:用大整数模拟十进制区间,tail应该是10的幂次(比如10^k),v // tail取的就是v的最高位十进制数字。把这个数字转成字符,本质是直接输出十进制数字的文本形式,压缩结果是一串十进制字符,而非二进制字节流。
这么做的好处是避开了二进制位操作的复杂细节,输出结果是人类可读的文本,很适合教学演示或简单场景;缺点是压缩率不如二进制实现(十进制每一位仅携带约3.32比特信息,二进制每一位是1比特,同等信息量下十进制输出长度更长)。
你看到的char类型转换,其实就是把截出的0-9整数转成对应的字符(比如数字5转成'5'),方便直接拼接成字符串输出。
内容的提问来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

