Comment mettre en œuvre 128 bits registre à décalage à rétroaction linéaire avec groupement d'éléments d'octets en C

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

  •  27-10-2019
  •  | 
  •  

Question

J'ai un tableau comme suit,

unsigned char A[16]

J'utilise ce tableau pour représenter un registre matériel 128 bits. Maintenant, je veux mettre en place un registre à décalage de rétroaction linéaire (LFSR, mise en œuvre de Fibonacci) en utilisant ce registre de long. Les polynômes (ou robinet) qui se connectent à la porte NON-OU exclusif de rétroaction de ce LFSR sont [128, 29, 27, 2, 1].

La mise en oeuvre d'un LFSR (robinets à [16, 14, 13, 11]) de 16 bits peut être obtenu à partir de Wikipedia comme suit.

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

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

Dans mon cas, cependant, j'ai besoin de déplacer les bits d'un élément d'octet à l'autre, par exemple, le msb ou A [0] besoin d'être passage à la lsb de A 1 . Qu'est-ce codage minimum pour faire ce changement? Merci!

Était-ce utile?

La solution

Pour calculer le bit à décalage en vous n'avez pas besoin de changer la totalité du tableau à chaque fois puisque vous ne souhaitez que un bit (notez le & 1 à la fin de la ligne bit = de Wikipedia).

Les montants de décalage vers la droite sont:

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

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

Maintenant, vous avez vraiment besoin de passer dans le 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);

Vous pouvez faire cela un peu plus efficace en utilisant uint32_t ou uint64_t au lieu de caractères non signés (selon la taille de votre mot de processeur), mais le principe est le même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top