Проблема
Мне нужно создать 32 битовых номера (подписанный или неподписанный не имеет значения, самый старший бит никогда не будет установлен в любом случае), и каждый номер должен иметь заданное количество битов.
Наивное решение
Самое простое решение - это, конечно, начать с нуля. В цикле число теперь увеличивается на единицу, подсчитывается количество битов, если счетчик имеет желаемое значение, номер сохраняется в списке, если цикл не повторяется. Цикл остановлен, если найдено достаточно чисел. Конечно, это работает отлично, но это ужасно медленно, как только количество желаемых бит становится очень высоким.
Лучшее решение
Простейшее число, имеющее (скажем) 5 Битов, заданное число, в котором установлены первые 5 бит. Этот номер можно легко создать. Внутри цикла устанавливается первый бит, а число сдвигается влево на единицу. Этот цикл работает 5 раз, и я нашел первое число с 5 битами. Следующие пару чисел легко создать. Теперь мы притворим, что число должно быть 6 бит в ширину, а верхнее - не установлено. Теперь мы начинаем смещать первый нулевой бит вправо, поэтому получаем 101111, 110111, 111011, 111101, 111110. Мы могли бы повторить это, добавив еще один фронт и повторить этот процесс. 0111110, 1011110, 1101110 и т.д. Однако таким образом числа будут расти намного быстрее, чем необходимо, поскольку, используя этот простой подход, мы оставляем числа, подобные 1010111.
Итак, есть ли лучший способ создать все возможные перестановки, общий подход, который можно использовать, независимо от того, сколько бит будет иметь следующий номер и независимо от того, сколько наборов бит нужно установить?