Как реализовать 128-битный регистр сдвига с линейной обратной связью с массивом байтовых элементов в C
Вопрос
У меня есть следующий массив
unsigned char A[16]
Я использую этот массив для представления 128-битного аппаратного регистра.Теперь я хочу реализовать регистр сдвига с линейной обратной связью (LFSR, реализация Фибоначчи) с использованием этого длинного регистра.Полиномы (или ответвления), которые подключаются к вентилю обратной связи xnor этого LFSR, равны [128, 29, 27, 2, 1].
Реализацию 16-битного LFSR (точки [16, 14, 13, 11]) можно получить из Википедия следующим образом.
родовое словоОднако в моем случае мне нужно сдвинуть биты с одного байтового элемента на другой, напримерmsb или A [0] необходимо сместить на lsb в 1 .Какой минимальный код для этого перехода? Спасибо!
Решение
Чтобы вычислить сдвигающийся бит, вам не нужно каждый раз сдвигать весь массив, поскольку вас интересует только один бит (обратите внимание на код & 1
в конце строки кода bit =
из Википедии).
Значения сдвига вправо:
родовое словоИтак,
родовое словоТеперь вам действительно нужно сместить бит:
родовое слово Вы можете сделать это немного более эффективным, используя uint32_t
или uint64_t
вместо символов без знака (в зависимости от размера слова вашего процессора), но принцип тот же.