двоичный — Преобразование битовой последовательности в uint32_t в переполнении стека

Пользователь указывает длину регистра (LFSR) с целым числом в качестве параметра для функции, например, он вводит число 5. Мне нужно инициализировать этот 5-разрядный LFSR длины со всеми 1 битами (для длины 5 это будет 11111) и получить маску в формате uint32_t — для 5-ти длинного регистра это будет 0x0001f,

Каков наилучший способ получить маску 0x0001f для регистра длиной 5 бит, когда пользователь вводит только длину регистра как целое число 5?

2

Решение

Сгенерировать маску из n бит (где n < 32):

uint32_t mask = (1U << n) - 1U;

Пояснение: рассмотрим пример, где n = 5:

1U << n = 1U << 5 = 0000 0000 0000 0000 0000 0000 0010 0000 = 0x20

тогда мы вычитаем 1 и получаем:

                    0000 0000 0000 0000 0000 0000 0001 1111 = 0x1f
7

Другие решения

Другой вариант

std::uint32_t mask = ~(~0U << n);

Также вы должны убедиться, unsigned int не менее 32 бит в вашей системе, лучше написать

std::uint32_t mask = ~(~(std::uint32_t)0 << n);
2

По вопросам рекламы [email protected]