实现流压缩算法,通常需要具有以下功能的超快速FIFO位容器类:
AddBits(UINT n, UINT nBits); // Add lower nBits bits of n
GetBitCount(); // Get the number of bits currently stored
GetBits(BYTE* n, UINT nBits); // Extract n Bits, and remove them
位数被限制为相对较小的大小(“数据包”大小或更多)。
我正在寻找一个实现此功能的小型C ++类。
是的,我可以写一个(并且知道该怎么做),但可能有人写过它......
注意:我不想为此为我的项目添加boost / whatever-big-lib。
答案 0 :(得分:1)
我在嵌入式系统中使用的一种方法,当我一直希望一次读取16位或更少时,是保持32位长,保持当前的部分16位字,下一个整数。然后代码就像:
/* ui=unsigned 16-bit ul=unsigned 32-bit LT == less-than SHL = shift-left */ ul bit_buff; ui buff_count; ui *bit_src; unsigned int readbits(int numbits) { if (buff_count LT numbits) { bit_buff |= ((ul)(*bit_src++)) SHL buff_ct; buff_ct += 16; } buff_ct -= numbits; return bit_buff & ((1 SHL numbits)-1); }
这可能很容易适应64位长的使用,并允许一次最多撤回32位。
答案 1 :(得分:0)
我知道你不想,但你可以使用boost dynamic bitset并使用供应商/消费者语义在其上提供FIFO功能。
我也不想使用提升,但这真的不是什么大问题。您不必对库执行任何操作。您只需要在构建系统上提供增强功能并包含正确的包含文件。