Como implementar 128 bits registo de deslocamento de realimentação linear com elemento byte matriz em C
Pergunta
Eu tenho uma matriz como segue,
unsigned char A[16]
Eu estou usando essa matriz para representar um registo hardware de 128 bits. Agora eu quero implementar um registo de deslocamento linear com realimentação (LFSR, implementação Fibonacci) usando este longo registo. Os polinómios (ou da torneira) que se ligam para a porta de feedback xnor deste LFSR são [128, 29, 27, 2, 1].
A aplicação de uma 16 bits LFSR (torneiras em [16, 14, 13, 11]) pode ser obtido a partir de
unsigned short lfsr = 0xACE1u;
unsigned bit;
unsigned rand()
{
bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
return lfsr = (lfsr >> 1) | (bit << 15);
}
No meu caso, no entanto, eu preciso mudar os bits de um elemento byte para outro, por exemplo, o MSB ou A [0] necessidade de ser mudança para o bit menos significativo de um 1 . O que é mínimo de codificação para fazer essa mudança? Obrigado!
Solução
Para calcular a pouco a mudança na você não precisa mudar toda a gama cada vez que desde que você está interessado em apenas um bit (note a & 1
no final da linha bit =
da Wikipedia).
Os montantes deslocamento para a direita são:
128 - 128 = 0 => byte 0 bit 0
128 - 29 = 99 => byte 12 bit 3
128 - 27 = 101 => byte 12 bit 5
128 - 2 = 126 => byte 15 bit 6
128 - 1 = 127 => byte 15 bit 7
Assim,
bit = ((A[0] >> 0)
^ (A[12] >> 3)
^ (A[12] >> 5)
^ (A[15] >> 6)
^ (A[15) >> 7)) & 1;
Agora, você realmente precisa mudar no bit:
A[0] = (A[0] >> 1) | (A[1] << 7);
A[1] = (A[1] >> 1) | (A[2] << 7);
// and so on, until
A[14] = (A[14] >> 1) | (A[15] << 7);
A[15] = (A[15] >> 1) | (bit << 7);
Você pode fazer isso um pouco mais eficiente usando uint32_t
ou uint64_t
em vez de caracteres não assinados (dependendo do seu tamanho processador de texto), mas o princípio é o mesmo.