Я хотел бы использовать только побитовое (если возможно), чтобы увеличить группу битов набора (1) на следующую доступную позицию с той же мощностью.
Учитывая набор с количеством элементов 5 ( 5 битов) и подмножество с количеством элементов 3 (3 бита), как я могу пройти все 3-битные комбинации в 5-битном наборе, используя только побитовое значение?
Например, давайте начнем с самой низкой доступной позиции для битов, как описано выше (с прямым порядком байтов):
00111 = 7 Далее я хочу - используя побитовую операцию - увеличить набор битов до следующей доступной позиции с той же мощностью , так:
01011 = 11
Я нашел способ начать это делать, но он очень скоро сломается, как вы увидите ...
Вот некоторые javascript хотя это, вероятно, похожий код на других C языках стиля:
// NOTE: I give binary values as 5 bits because that is what I'm discussing as an example,
// so you wouldn't actually get outputs showing only 5 bit positions unless you asked for
// it specifically.
(16 | 7) >> 1 // outputs integer 11 or binary 01011
Сначала мы ИЛИ 16 и 7 и получаем 10111, затем мы ПРАВО Смещаем его на 1 бит, поэтому вы получаете 01011
Затем мы можем начать увеличиваться на Передача текущего целого числа для получения следующего доступного целого числа с той же мощностью:
(16 | 11) >> 1 // outputs integer 13 or binary 01101
(16 | 13) >> 1 // outputs integer 14 or binary 01110
(16 | 14) >> 1 // outputs integer 15 or binary 01111 <-- It breaks here
// We don't want 4 set bits, our next integer should be 19 or binary 10011
Как уже упоминалось, это начало попытки его обобщить, чтобы оно работало с любым целым числом. Очевидно, что использование 16 не сработает, но вместо этого необходимо некоторое возведение в степень 2 (иначе 2 ** x, где x равен мощности множества ... может быть?)
Чтобы получить следующее значение в нашем примере с использованием модифицированной версии приведенного выше кода:
(64 | 14) >> 2 // outputs integer 19 or binary 10011
Мой список пожеланий для решения:
- Используется только поразрядно & basi c арифметика c
- является одной операцией
- Не обернута условиями (IF) или циклом (DO / WHILE)
Я не знаю ... это может быть невозможным, но я чувствую, что где-то там есть Гик-отшельник, живущий на Козьей горе с высокоскоростным inte rnet, у которого есть решение этой гравировки - не имея другого доступного субстрата - на сплющенный кусок обезвоженного хлеба (возможно, взломщик?)
Если я превращусь в этого Гика-Отшельника и решу это; Я сообщу обратно с взломщиком.