gpt4 book ai didi

c - C语言如何用字节元素数组实现128位线性反馈移位寄存器

转载 作者:太空狗 更新时间:2023-10-29 15:59:35 24 4
gpt4 key购买 nike

我有一个数组如下,

unsigned char A[16]

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

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

  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 的 lsb 1 .进行这种转变的最少编码是多少?谢谢!

最佳答案

要计算要移入的位,您不需要每次都移动整个数组,因为您只对一位感兴趣(注意 末尾的 & 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 而不是无符号字符(取决于您的处理器字长)来提高效率,但原理是相同的。

关于c - C语言如何用字节元素数组实现128位线性反馈移位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com