算术压缩中high补1、low补0的实现逻辑疑问
算术编码移位补位操作的两个疑问解答
疑问1:为啥把1移入high的最低位而不是0?
就是为了最大化high的取值,核心是维持算术编码区间的精度,避免过早丢失有效范围。
算术编码里我们用整数区间[low, high)来近似模拟连续的概率区间[0,1)。当触发移位操作(比如low和high最高位相同,需要输出该位并压缩区间),左移high后补1,是为了让high始终保持当前能表示的最大上限——毕竟high是区间的上边界,补1能让它尽可能贴近1的边界,防止区间宽度过早缩小导致精度不够。举个8位整数的例子:初始high是0xFF,左移一位后补1,得到的新high依然是当前范围内的最大可能值,这样后续划分概率区间时才有足够的空间,不会因为上限被压低而出错。
疑问2:作者说0被移入low的最低位,但代码里没显式写,怎么保证low最低位是0?
这是因为绝大多数编程语言的左移操作默认会在最低位补0(比如C里的无符号整数<<操作),作者说的“移入0”其实是靠这个语言特性实现的,根本不需要额外写代码。
从算法逻辑来讲,low是区间的下边界,左移后补0是为了维持下界的最小化特性,保证区间划分正确。你看原代码里的low <<= 1,执行这句时,low的二进制位左移一位,右边空出来的最低位会自动填0,完全符合算法要求,所以没必要显式写补0的代码。
内容的提问来源于stack exchange,提问作者web4141
相关产品推荐
相关产品推荐

