对于实际实现,请查看解码器的 (C) 编程代码。
基本上这个过程很简单,你创建一个抽象,比如
bits = get_bits(n)
其中,n是您要读取的 n 位。varbits左对齐。它从一些中提取它byte_buffer——比如 32 位或 64 位符号。
注意:所有实用的编解码器都将主要符号置于“字节对齐”位置,即使 > 内部符号可以逐位排列。
现在对于实现效率部分,基本上,不管哈夫曼代码会是什么(以及因此需要什么n)。
这就是实现简单 get_bits 的方式:
// At start
frame_buffer = 0x4444
bits_delivered = 0
n = 1
mask = 0x8000
bits = (mask & frame_buffer) >> 32-n
mask = mask >> n
bits_delivered += n
if(bits_delivered == 32)
{ load_framebuffer( &frame_buffer) }
(实际代码需要处理更多的边界条件)实际数据首先被提取到frame_bufferALU 内部的 32 位寄存器中(实际上是 16/32/64 位,具体取决于 CPU 的类型),然后剩下的处理是仅在 ALU 的寄存器内。
只有当你用尽 frame_buffer 时,你才会真正刷新那个位缓冲区并从内存中获取另一个整数。
这就是它获得有效实施的方式。希望这能回答你的问题。