побитовые операции над вектором <bool> - PullRequest
15 голосов
/ 29 октября 2010

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

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

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

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

спасибо!

Ответы [ 4 ]

9 голосов
/ 29 октября 2010

Если количество битов фиксировано во время компиляции, вам будет гораздо лучше использовать std::bitset

Если нет (то есть количество битов изменяется во время выполнения), то вы должны увидеть и можете использовать boost::dynamic_bitset)

В обоих случаях чрезвычайно просто выполнять все побитовые операции.

4 голосов
/ 29 октября 2010

Игнорируя заголовок вашего вопроса, давайте ответим на этот вопрос, вместо этого:

Каков наилучший способ выполнения побитовых операций над вектором?

Лучший способ - определить ваш вектор как vector<unsigned char> (или vector<uint32_t>, или любой другой тип целочисленного значения, который вы выберете), и выполнять побитовые операции, как обычно для массива целых чисел без знака.В этом случае все будет намного быстрее, и не будет скрытого механизма.

Вы можете использовать деление (или побитовые операторы, если вы ловкие), чтобы определить, с каким индексом массива вам нужно работать, и для-loops для применения побитовых операций, больших, чем один элемент.

Вот еще один вопрос: Бит с большим количеством битов в C

В основном вы будете делать то же самоеопераций, если и когда вы решите обернуть vector<unsigned some-int-type> с вашими собственными операторами.

3 голосов
/ 28 августа 2011

Я прочитал оба этих ответа, но просто хотел быстрое решение и реализовал что-то ужасное.

Вы можете заставить побитовые операторы работать на vector<bool>, но код должен быть специализирован для стандарта c ++реализация библиотеки или возврат к медленной форме.Вот мой operator| для GNU libstdc ++ - 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, новая версия хранит вещи по-другому, и ваш код ломается без видимой причины.

0 голосов
/ 25 марта 2012

Этот тоже должен работать.

std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(), 
               v2.begin(), v3.begin(), std::logical_and<bool>());
...