Создание маски с использованием C ++ bitrtrins - PullRequest
3 голосов
/ 30 мая 2019

Допустим, мы хотим создать маску типа unsigned short с непрерывным набором len 1, начиная с позиции a, с как можно меньшим количеством инструкций. Самый популярный способ сделать это -

T mask = ((1 << len)-1) << a;

Где T - любой встроенный беззнаковый целочисленный тип.

У меня следующий вопрос: если a != 0 && a + len < DIGITS, где DIGITS - это постоянная времени компиляции, равная числу битов в слове типа T, можем ли мы что-нибудь сделать (встроенные функции компилятора или встроенные функции) сохранить хотя бы одну инструкцию? Я ищу ответы как можно более универсальными (архитектура и компилятор нейтральны), однако ответы, которые работают только в определенных системах или в определенных контекстах, также полезны, прежде всего, когда они являются контекстами, определяемыми во время компиляции.

Редактировать / Leaderboard:

- 4 инструкции : _bzhi_u32(-1,len) << first_pos
(однако, как обсуждали люди в комментариях, я мало что знаю о задержке инструкции _bhzi)

- 6 инструкций (просто добавив флаг -O1)

...