Отображение указанных c битов во входных байтах на указанные c биты в выходном слове - PullRequest
0 голосов
/ 26 февраля 2020

Фон : Учитывая некоторые входные байты B0, B1, B2, B3 и B4, я хочу извлечь выбранные биты из этих 5 байтов и сгенерировать выходное слово.

Например, обозначая n -й бит B i как Bi[n], я хочу иметь возможность написать отображение f : (B0, B1, B2, B3 , B4) → B2[4] B3[5] B3[4] B3[3] B3[2] B3[1] B0[5] B0[3] B0[1]. Так что f(0b11001, 0b01100, 0b10101, 0b10011, 0b11111) вернет 0b010011101.

Выражение в C, которое может сделать этот точный пример, будет

(B2 & 4 << 5) | (B3 << 3) | (B0 & 16 << 2) | (B0 & 4 << 1) | (B0 & 1)

с использованием наивных битовых масок и битовых сдвигов.


Вопрос : Есть ли способ упростить такое выражение, чтобы минимизировать количество операций, которые необходимо выполнить?

Например, я отмечаю, что B3 копируется в полностью к некоторым битам вывода, поэтому я положил его на место, используя B3 << 3 вместо маскирования и сдвига отдельных битов. Первым, о чем я подумал, были карты Карно, поскольку они пригодились для упрощения логических выражений, но я понял, что, поскольку я извлекаю и размещаю отдельные биты в разных частях байта, упрощение с помощью логической алгебры невозможно.


Обоснование : Причина, по которой я хочу это сделать, заключается в том, чтобы иметь возможность подсветить светодиоды удобным для программиста способом на BB C micro: bit. Я хочу, чтобы от B0 до B4 представляли, какие светодиоды включены в физической схеме 5x5, но в электронном виде эти светодиоды подключены в сложной конфигурации 3x9. Более подробную информацию о светодиодах можно найти здесь .

Как правило, шаблон будет храниться в памяти в соответствии с физической схемой 3x9, чтобы иметь возможность выводить этот шаблон на светодиоды в виде Отдельная инструкция, но я хочу иметь возможность сопоставлять шаблон 5x5 с шаблоном 3x9. Однако выражение, как показано выше, потребует 5 инструкций загрузки, 9 побитовых операций И ​​/ ИЛИ и 4 логических сдвигов, что по меньшей мере в 9 раз неэффективно, чем обычный метод.

...