Cómo implementar un registro de desplazamiento de retroalimentación lineal de 128 bits con una matriz de elementos de bytes en C

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Tengo una matriz de la siguiente manera,

unsigned char A[16]

Estoy usando esta matriz para representar un registro de hardware de 128 bits.Ahora quiero implementar un registro de desplazamiento de retroalimentación lineal (LFSR, implementación de Fibonacci) usando este registro largo.Los polinomios (o tap) que se conectan a la puerta xnor de retroalimentación de este LFSR son [128, 29, 27, 2, 1].

La implementación de un LFSR de 16 bits (tomas en [16, 14, 13, 11]) se puede obtener de Wikipedia como el seguiente.

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

  unsigned rand()
  {
    bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
    return lfsr =  (lfsr >> 1) | (bit << 15);
  }

En mi caso, sin embargo, necesito cambiar bits de un elemento de byte a otro, por ejemplo.el msb o A[0] deben cambiarse al lsb de A1.¿Cuál es la codificación mínima para realizar este cambio?¡Gracias!

¿Fue útil?

Solución

Para calcular el bit a desplazar, no necesita desplazar toda la matriz cada vez, ya que solo le interesa un bit (tenga en cuenta el & 1 al final de bit = línea de Wikipedia).

Las cantidades de turno correctas son:

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

Entonces,

bit = ((A[0] >> 0) 
    ^  (A[12] >> 3) 
    ^  (A[12] >> 5) 
    ^  (A[15] >> 6) 
    ^  (A[15) >> 7)) & 1;

Ahora, realmente necesitas cambiar un poco:

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);

Puedes hacer esto un poco más eficiente usando uint32_t o uint64_t en lugar de caracteres sin firmar (dependiendo del tamaño de palabra de su procesador), pero el principio es el mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top