Как перебрать все цепочки битов с одним 0, двумя 0, вплоть до n 0?

У меня есть функция для увеличения битовой строки следующим образом:

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

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

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

Как я мог настроить такую ​​функцию? Спасибо!

1 ответ

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

Другие вопросы по тегам