У меня есть битовый набор С++ заданной длины. Я хочу сгенерировать все возможные комбинации этого набора битов, для которых я думал добавить 1 2 ^ битсет.длина раз. Как это сделать? Решение библиотеки Boost также приемлемо
добавить 1 к битовому набору С++
comment
ну ... я не мог видеть операцию добавления, и ручная проверка всех битов не представляется возможной. Так я ничего и не пробовал
- person wirate   schedule 28.04.2012
Ответы (3)
Все возможные комбинации? Просто используйте 64-битное целое число без знака и упростите себе жизнь.
person
zvrba
schedule
28.04.2012
Затем мне придется снова и снова преобразовывать это целое число в набор битов, чтобы получить значения отдельных битов. Так как битовый набор‹ некоторый переменный размер › невозможен в битовом наборе STL, я буду использовать boost. И если я сделаю bitset‹ value › mybitset, и значение = 2, мне потребуется 00010 вместо 10. Возможно ли это? Надеюсь, это имеет смысл для вас :)
- person wirate; 28.04.2012
Нет, вам не придется преобразовывать его обратно в набор битов для извлечения отдельных битов — научитесь использовать побитовые операторы. 00010 совпадает с 10; только от вас зависит, сколько начальных нулей целого числа вы хотите извлечь.
- person zvrba; 28.04.2012
Вы имеете в виду, что я могу видеть, установлен ли третий бит int или нет? Пожалуйста, укажите мне куда-нибудь!
- person wirate; 28.04.2012
@wirate: изучите магию операторов
&
, <<
и >>
применительно к целым числам.
- person Alexey Frunze; 28.04.2012
bool isNthBitSet(unsigned long long bitset, unsigned char bitNum) { return bitset & (1ULL << bitNum); }
Конечно, я игнорировал проблемы с переполнением.
- person Tadeusz Kopec; 28.04.2012
@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