2015-06-25 2 views
2

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

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

ответ

7

Для создания маски из п битов (где п < 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 
+0

спасибо за объяснение - я получил его, вы помогли меня много! – Illania

2

Другой оптический кабель п

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

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

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