Как эффективно извлекать слова из битового набора?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как эффективно извлекать слова из битового набора?

Сообщение Anonymous »

И в libstdc++, и в libc++ std::bitset внутренне основан на массиве (машинных) слов. Я хотел бы эффективно извлечь эти слова как целые числа. В идеале это извлечение должно выполнять только чтение необходимого слова из базового массива. Я попытался написать код для этого извлечения, который выглядит следующим образом (предполагается, что 64-битное слово и N кратно 64):

Код: Выделить всё

template 
unsigned long extract_word(const std::bitset& bs)
{
static constexpr std::bitset mask
= std::numeric_limits::max();

auto res = bs >> IW * 64;
res &= mask;

return res.to_ulong();
}
Проблема в том, что в моих тестовых случаях это приводило к чрезвычайно длинному и сложному машинному коду в отличие от чтения одного элемента массива. Живая демонстрация: https://godbolt.org/z/rqhhcqKd9.
Мой вопрос: есть ли способ извлечь слова из std::bitset «напрямую» из базового массива.
Мотивация
Я хочу использовать наборы битов в качестве ключей для хеш-таблицы. Хотя для std::hash существует специализация std::bitset, похоже, она реализована не слишком хорошо. В libc++ хеширование основано на простом XOR для слов массива. В libstdc++ этот метод более сложен, но он работает с отдельными байтами, а не со словами. Я бы предпочел использовать boost::hash, например, сначала извлекая слова в массив. (Например, boost::dynamic_bitset предоставляет для этой цели функцию to_block_range.)

Подробнее здесь: https://stackoverflow.com/questions/798 ... m-a-bitset
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»