2010-08-31 47 views
1

实现流的压缩算法快速比特数组类,一个通常需要具有以下功能的一个超高速FIFO位容器类:C++用于流的压缩算法

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++类。

是的,我可以写一个(并且知道如何做到这一点),但可能有人写它已经...

注:我不想升压/不管,大的lib添加到我的项目就是为了这个。

+0

boost有什么问题? http://stackoverflow.com/questions/2633400/c-c-efficient-bit-array – Anycorn 2010-08-31 18:31:47

+1

大部分升压只是头。您可能会由于不使用它而缺少很多实现的功能。你看过std :: bitset – Anycorn 2010-08-31 18:40:56

+1

你不想使用boost,因为将它添加到你的项目需要比实现类更长的时间?下一个这样的小班和下一个怎么样... – torak 2010-08-31 18:43:56

回答

0

我知道你不想,但你可以使用boost dynamic bitset,并使用供应商/消费者语义在其上提供FIFO功能。

我也不想使用提升,但它真的没什么大不了的。你不必对图书馆做任何事情。您只需要在构建系统上提供可用的提升,并包含正确的包含文件。

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位的撤​​出。