3

我有一个数组如下,

unsigned char A[16]

我使用这个数组来表示一个 128 位硬件寄存器。现在我想使用这个长寄存器来实现一个线性反馈移位寄存器(LFSR,斐波那契实现)。连接到这个 LFSR 的反馈 xnor 门的多项式(或抽头)是 [128, 29, 27, 2, 1]。

可以从Wikipedia获得 16 位 LFSR(在 [16, 14, 13, 11] 处的抽头)的实现,如下所示。

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

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

但是,在我的情况下,我需要将位从一个字节元素转移到另一个,例如 msb 或 A[0] 需要转移到 A 1的 lsb 。进行这种转变的最低编码是多少?谢谢!

4

1 回答 1

8

要计算要移入的位,您不需要每次都移动整个数组,因为您只对一位感兴趣(请注意维基百科行& 1尾的bit =)。

右移量为:

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;

现在,你真的需要改变一点:

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

您可以通过使用uint32_tuint64_t代替无符号字符(取决于您的处理器字长)来提高效率,但原理是相同的。

于 2011-10-20T03:00:44.957 回答