Преобразование битовой маски uint64_t в std::array bool

Цель состоит в том, чтобы преобразовать std::uint64_t (который используется как битовая маска) в std::array<bool>.

Этот вопрос аналогичен вопросу С# Как можно Я конвертирую int в массив bool?, но для C++ ищу алгоритм с наилучшей производительностью.

Учитывая std::uint64_t, который используется в качестве битовой маски, я знаю, что можно просто побитово перебрать его содержимое и установить битовое сравнение с теми, которые находятся в той же позиции в std::array<bool>.

Но во всемогущем C++ должен быть более эффективный способ! Может быть, какие-то грязные приведения, mallocs или что-то еще? Все ок; Я работаю в Windows/GCC, поэтому полностью разрешены даже функции только для GCC.


person nada    schedule 06.07.2018    source источник
comment
... даже встроенный asm в порядке   -  person nada    schedule 06.07.2018
comment
Вам действительно нужен std::array<bool>? Вы можете преобразовать битовую маску в std::bitset, чтобы получить произвольный доступ к отдельным битам.   -  person NathanOliver    schedule 06.07.2018
comment
@NathanOliver Звучит нормально, но скучно   -  person nada    schedule 06.07.2018
comment
Нет приведения, которое переведет вас с 64 бит на 64 байта, если предположить, что в вашей системе используется логическое значение. bitset, вероятно, лучший способ пойти сюда. Есть ли конкретная проблема, которую вы пытаетесь решить? Мне кажется, что наилучшей производительностью было бы сохранить ваш uint64_t и извлекать нужные вам биты, когда они вам нужны.   -  person Retired Ninja    schedule 06.07.2018
comment
Если вы ориентируетесь на x86, вы можете использовать некоторые векторные инструкции (AVX?) для хранения частей слова в разных целях. Насчет других ISA не уверен.   -  person Toby Speight    schedule 06.07.2018


Ответы (1)


Если вам просто нужен произвольный доступ к отдельным битам, вы можете вместо этого использовать std::bitset. std::array. Это будет выглядеть как

uint64_t mask = some_value;
std::bitset<64> random_access(mask);

// and now you can use random_access[some_index]

Однако в std::bitset отсутствуют члены begin() и end(), поэтому вы не можете использовать его с циклом for на основе диапазона как есть. Однако вы можете перебирать std::bitset, используя обычный индекс, основанный на цикле for, например

for (size_t i = 0; i < random_access.size(); ++i)
    std::cout << random_access[i] << "\n";
person NathanOliver    schedule 06.07.2018
comment
Если бы я знал, что существует такое простое (и поэтому скучное) решение, я бы не стал спрашивать :'( - person nada; 06.07.2018
comment
@nada Извините, иногда С++ просто дает вам то, что вы хотите;) - person NathanOliver; 06.07.2018