Come implementare un registro a scorrimento con feedback lineare a 128 bit con array di elementi byte in C

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

  •  27-10-2019
  •  | 
  •  

Domanda

Ho un array come segue,

unsigned char A[16]

Sto usando questo array per rappresentare un registro hardware a 128 bit.Ora voglio implementare un registro a scorrimento con feedback lineare (LFSR, implementazione di Fibonacci) usando questo registro lungo.I polinomi (o tap) che si collegano al feedback xnor gate di questo LFSR sono [128, 29, 27, 2, 1].

L'implementazione di un LFSR a 16 bit (tocchi a [16, 14, 13, 11]) può essere ottenuta da Wikipedia come segue.

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

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

Nel mio caso, tuttavia, ho bisogno di spostare i bit da un elemento di byte a un altro, ad es.msb o A [0] devono essere spostati in lsb di A 1 .Qual è la codifica minima per eseguire questo spostamento? Grazie!

È stato utile?

Soluzione

Per calcolare il bit da spostare non è necessario spostare l'intero array ogni volta poiché sei interessato solo a un bit (nota il & 1 alla fine della riga bit = da Wikipedia).

Gli importi dei turni corretti sono:

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

Quindi,

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

Ora, devi davvero cambiare punto:

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

Puoi renderlo un po 'più efficiente utilizzando uint32_t o uint64_t invece di caratteri non firmati (a seconda della dimensione della parola del processore), ma il principio è lo stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top