Класс быстрых битовых массивов C ++ для потоковых алгоритмов сжатия - PullRequest
1 голос
/ 31 августа 2010

Реализуя алгоритмы потокового сжатия, обычно требуется супербыстрый класс битовых контейнеров 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 / what-big-lib только для этого.

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Один из подходов, которые я использовал во встроенных системах, когда мне всегда хотелось читать 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 бит за раз.

0 голосов
/ 31 августа 2010

Я знаю, что вы не хотите, но вы могли бы использовать динамический битовый набор повышения и обеспечить возможность FIFO поверх него с использованием семантики поставщика / потребителя.

Я тоже не хотел использовать повышение, но на самом деле это не имеет большого значения. Вам не нужно ничего делать с библиотеками. Вам просто нужно иметь повышение в вашей системе сборки и включать правильные включаемые файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...