Побитовые операции над вектором <bool>
какой лучший способ выполнить побитовые операции на vector<bool>
?
как я понимаю, vector<bool>
- это специализация, которая использует один бит в буле. Я выбрал vector<bool>
для экономии памяти. Я знаю, что есть проблемы с vector<bool>
, но для моих нужд это возможно.
теперь - какой самый эффективный способ приближения побитовых операций к целым таким векторам?
если я делаю это в цикле for и считываю каждый отдельный bool и сохраняю его, то, как я понимаю, для доступа к фактическим значениям выполняется намного больше операций.
спасибо!
Ответы
Ответ 1
Если количество бит фиксировано во время компиляции, вам будет намного лучше использовать std::bitset
Если нет, (то есть количество бит изменяется во время выполнения), то вы должны увидеть и использовать boost::dynamic_bitset
)
В обоих случаях очень просто выполнять все побитовые операции.
Ответ 2
Игнорируя заголовок вашего вопроса, ответьте на этот вопрос:
какой лучший способ выполнить побитовые операции над вектором?
Лучший способ - определить ваш вектор как vector<unsigned char>
(или vector<uint32_t>
или любой другой тип целого, который вы выберете), и выполнять побитовые операции, как обычно для массива целых чисел без знака. Все будет намного быстрее, и не будет скрытого механизма.
Вы можете использовать деление (или побитовые операторы, если вы используете), чтобы разрешить, с каким индексом массива вам нужно работать, и for-loops применять побитовые операции, превышающие один элемент.
Вот связанный вопрос:
Бит, чередующий много бит в C
В основном вы будете выполнять эти же операции, если и когда вы решите обернуть vector<unsigned some-int-type>
своими собственными операторами.
Ответ 3
Я прочитал оба этих ответа, но просто хотел получить быстрое решение и реализовал что-то ужасное.
Вы можете заставить побитовые операторы работать с vector<bool>
, но код должен быть специализированным для реализации стандартной библиотеки С++ или вернуться к медленной форме. Здесь my operator|
для GNU libstdС++ - v3:
std::vector<bool> operator|(std::vector<bool> A, const std::vector<bool>& B)
{
if (A.size() != B.size())
throw std::invalid_argument("differently sized bitwise operands");
std::vector<bool>::iterator itA = A.begin();
std::vector<bool>::const_iterator itB = B.begin();
// c++ implementation-specific
while (itA < A.end())
*(itA._M_p ++) |= *(itB._M_p ++); // word-at-a-time bitwise operation
return A;
}
Это, конечно, очень плохо. Кто-то обновляет GCC, новая версия хранит вещи по-другому, и ваш код ломается без видимых причин.
Ответ 4
Этот файл тоже должен работать.
std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(),
v2.begin(), v3.begin(), std::logical_and<bool>());