добавить 1 к битовому набору С++

У меня есть битовый набор С++ заданной длины. Я хочу сгенерировать все возможные комбинации этого набора битов, для которых я думал добавить 1 2 ^ битсет.длина раз. Как это сделать? Решение библиотеки Boost также приемлемо


person wirate    schedule 28.04.2012    source источник
comment
ну ... я не мог видеть операцию добавления, и ручная проверка всех битов не представляется возможной. Так я ничего и не пробовал   -  person wirate    schedule 28.04.2012


Ответы (3)


Все возможные комбинации? Просто используйте 64-битное целое число без знака и упростите себе жизнь.

person zvrba    schedule 28.04.2012
comment
Затем мне придется снова и снова преобразовывать это целое число в набор битов, чтобы получить значения отдельных битов. Так как битовый набор‹ некоторый переменный размер › невозможен в битовом наборе STL, я буду использовать boost. И если я сделаю bitset‹ value › mybitset, и значение = 2, мне потребуется 00010 вместо 10. Возможно ли это? Надеюсь, это имеет смысл для вас :) - person wirate; 28.04.2012
comment
Нет, вам не придется преобразовывать его обратно в набор битов для извлечения отдельных битов — научитесь использовать побитовые операторы. 00010 совпадает с 10; только от вас зависит, сколько начальных нулей целого числа вы хотите извлечь. - person zvrba; 28.04.2012
comment
Вы имеете в виду, что я могу видеть, установлен ли третий бит int или нет? Пожалуйста, укажите мне куда-нибудь! - person wirate; 28.04.2012
comment
@wirate: изучите магию операторов &, << и >> применительно к целым числам. - person Alexey Frunze; 28.04.2012
comment
bool isNthBitSet(unsigned long long bitset, unsigned char bitNum) { return bitset & (1ULL << bitNum); } Конечно, я игнорировал проблемы с переполнением. - person Tadeusz Kopec; 28.04.2012
comment
@wirate Я указывал вам куда-то: ищите побитовые операторы. Например: en.wikipedia.org/wiki/Bitwise_operation или cprogramming.com/tutorial/bitwise_operators.html - person zvrba; 28.04.2012

Попробуй это:

/*
 * This function adds 1 to the bitset.
 *
 * Since the bitset does not natively support addition we do it manually. 
 * If XOR a bit with 1 leaves it as one then we did not overflow so we can break out
 * otherwise the bit is zero meaning it was previously one which means we have a bit 
 * overflow which must be added 1 to the next bit etc.
 */
void increment(boost::dynamic_bitset<>& bitset)
{
    for(int loop = 0;loop < bitset.count(); ++loop)
    {
        if ((bitset[loop] ^= 0x1) == 0x1)
        {    break;
        }
    }
}
person Martin York    schedule 28.04.2012

Используя библиотеку boost, вы можете попробовать следующее:

Например, набор битов длиной 4

boost::dynamic_bitset<> bitset;
for (int i = 0; i < pow(2.0, 4); i++) {
    bitset = boost::dynamic_bitset<>(4, i);

    std::cout << bitset << std::endl;

}
person Yorel Live    schedule 26.12.2017