Подтвердить что ты не робот

Побитовые операции над вектором <bool>

какой лучший способ выполнить побитовые операции на vector<bool>?

как я понимаю, vector<bool> - это специализация, которая использует один бит в буле. Я выбрал vector<bool> для экономии памяти. Я знаю, что есть проблемы с vector<bool>, но для моих нужд это возможно.

теперь - какой самый эффективный способ приближения побитовых операций к целым таким векторам?

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

спасибо!

4b9b3361

Ответ 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>());