Comment mettre en œuvre 128 bits registre à décalage à rétroaction linéaire avec groupement d'éléments d'octets en C
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!
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.