2012-02-16 4 views
2

У меня есть функция прирастить битовый следующий образом:Как перебрать все бистроны с одним 0, двумя 0 с, вплоть до n 0s?

void increment(boost::dynamic_bitset<> &bitset) 
{ 
    for (int loop = 0; loop < bitset.size(); ++loop) 
    { 
     if ((bitset[loop] ^= 0x1) == 0x1) 
     { 
      break; 
     } 
    } 
} 

Я хочу функцию, которая вызывается тем же способом, как прирост будет называться, но изменяет битовую по-разному. Каждый раз, когда он вызывается, я хочу получить следующую битструю с тем же числом 0, что и предыдущий.

Например, если битстрона имеет длину 10, первые 10 вызовов этой функции будут давать битструю с одним 0. Затем вызовы с 11 по 20 возвратят битстроны с 2 0. Я хочу, чтобы это продолжалось до тех пор, пока битстрона не будет равна 0s.

Как я могу настроить такую ​​функцию? Благодаря!

+0

Похож на проблему XY –

+0

Если ваша строка имеет длину 10, вы можете просто перебрать интегральный диапазон '[0, 1 << 10)' и использовать эти целые числа. –

+0

@SethCarnegie Хорошо, разъяснение по проблеме :) Я представляю набор больших объектов битовой строкой и хочу сделать несколько тестов для всех подмножеств этой битовой строки. Тем не менее, я знаю, что подмножества, которые меня интересуют, обычно содержат только несколько элементов из набора, поэтому я хочу сгенерировать все подмножества, начиная с только одного элемента, удаленного и работающего вниз. – Jim

ответ

0

Ответы можно найти в разделе Matters Computational, глава 1.24.3 «Сдвиг-порядок». Вам нужно будет изменить целые числа на биты и перевернуть значения. Возможно, эта реализация не оптимальна при использовании с битами.

 Смежные вопросы

  • Нет связанных вопросов^_^