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

标签 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 添加到我的项目中。

最佳答案

当我总是想一次读取 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 位 long long 的使用,并允许一次提取多达 32 位。

关于用于流式压缩算法的 C++ 快速位数组类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612018/

相关文章:

c++ - 预期 { 在析构函数之前

C++ 状态机,具有语法不正确的成员值的继承类

c++ - 我的 SFML 项目的主循环只发生一次。有人知道为什么吗?

java - 从已排序的双向链表创建二叉搜索树

java - 为什么此 log4j 配置不压缩日志文件?

android - 由于图像,应用程序体积较大。如何压缩 .PNG 图片?

c++ - 为什么这个模板递归无法编译?

data-structures - 我应该在键落在一个范围内的地方使用什么数据结构?

sql - 如何使用 MongoDB 构建递归结构

compression - 路线图中是否有缩小 Dart 脚本?