Как я могу увеличить биты с фиксированным количеством элементов, используя побитовое значение? - PullRequest
0 голосов
/ 27 января 2020

Я хотел бы использовать только побитовое (если возможно), чтобы увеличить группу битов набора (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

Мой список пожеланий для решения:

  1. Используется только поразрядно & basi c арифметика c
  2. является одной операцией
  3. Не обернута условиями (IF) или циклом (DO / WHILE)

Я не знаю ... это может быть невозможным, но я чувствую, что где-то там есть Гик-отшельник, живущий на Козьей горе с высокоскоростным inte rnet, у которого есть решение этой гравировки - не имея другого доступного субстрата - на сплющенный кусок обезвоженного хлеба (возможно, взломщик?)

Если я превращусь в этого Гика-Отшельника и решу это; Я сообщу обратно с взломщиком.

...