用于流压缩算法的C ++快速位数组类

时间:2010-08-31 18:25:54

标签: c++ data-structures compression

实现流压缩算法,通常需要具有以下功能的超快速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。

2 个答案:

答案 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功能。

我也不想使用提升,但这真的不是什么大问题。您不必对库执行任何操作。您只需要在构建系统上提供增强功能并包含正确的包含文件。