Como implementar 128 bits registo de deslocamento de realimentação linear com elemento byte matriz em C

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

  •  27-10-2019
  •  | 
  •  

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 Wikipedia como o seguinte.

  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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top