Быстрое добавление битов? - PullRequest
2 голосов
/ 22 апреля 2011

Я ищу реализацию набора битов с быстрым добавлением битов, где несколько битов могут быть эффективно добавлены за один раз.

, например

char value = 31;
char n_bits = 5;
fast_bitset bits;
bits.append(value, n_bits);

До сих пор я пробовал boost :: dynamic_bitset и std :: vector. Оба из которых медленные.


Старый пост

Я использую boost :: dynamic_bitset для упаковки некоторых данных.

Обычно я хочу упаковать ~ 5 бит за раз, что приведет к такому вызову:

char value = 31;
char n_bits = 5;
boost::dynamic_bitset<> bits;
for(char n = n_bits-1; n >= 0; --n)
    bits.push_back((value >> n) & 1);

Однако это кажется мне совершенно неэффективным, разве нельзя добавить все биты за один раз?

, например

char value = 31;
char n_bits = 5;
boost::dynamic_bitset<> bits;
bits.append(value, n_bits);

Я бы ожидал, что это будет что-то вроде:

template<typename T>
void append(T value, size_t n_bits)
{
     value <<= sizeof(T) - n_bits; // Make target bits most significant, remove all non-target bits.

     // TODO: Shift bits into proper place and use OR to add all target bits to bitset in one go
}

Почему у dynamic_bitset такой функции нет? Можно ли будет эффективно реализовать?

1 Ответ

2 голосов
/ 22 апреля 2011

Используйте функцию-член resize.

/* Append the lower-order nbits bits from value to set. */
template <typename T>
void append(boost::dynamic_bitset<> &set, T value, size_t nbits)
{
    set.resize(set.size() + nbits);
    for (size_t i=1; i<=nbits; i++) {
        set[set.size() - i] = value & 1;
        value >>= 1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...