Как реализовать 128-битный регистр сдвига с линейной обратной связью с массивом байтовых элементов в C

StackOverflow https://stackoverflow.com/questions/7830379

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть следующий массив

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 вместо символов без знака (в зависимости от размера слова вашего процессора), но принцип тот же.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top