Пользователь указывает длину регистра (LFSR) с целым числом в качестве параметра для функции, например, он вводит число 5. Мне нужно инициализировать этот 5-разрядный LFSR длины со всеми 1 битами (для длины 5 это будет 11111
) и получить маску в формате uint32_t
— для 5-ти длинного регистра это будет 0x0001f
,
Каков наилучший способ получить маску 0x0001f
для регистра длиной 5 бит, когда пользователь вводит только длину регистра как целое число 5?
Сгенерировать маску из 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
Другой вариант
std::uint32_t mask = ~(~0U << n);
Также вы должны убедиться, unsigned int
не менее 32 бит в вашей системе, лучше написать
std::uint32_t mask = ~(~(std::uint32_t)0 << n);