Допустим, мы хотим создать маску типа 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
)