首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用C语言实现128位字节数组线性反馈移位寄存器

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

Stack Overflow用户
提问于 2011-10-20 10:07:16
回答 1查看 4.5K关注 0票数 3

我有一个如下数组,

unsigned char A[16]

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

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

代码语言:javascript
复制
  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需要移位到A1的lsb。完成这种转换的最小编码是什么?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-20 11:00:45

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

正确的移位量是:

代码语言:javascript
复制
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

所以,

代码语言:javascript
复制
bit = ((A[0] >> 0) 
    ^  (A[12] >> 3) 
    ^  (A[12] >> 5) 
    ^  (A[15] >> 6) 
    ^  (A[15) >> 7)) & 1;

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

代码语言:javascript
复制
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代替无符号字符(取决于您的处理器字长)来提高效率,但原理是相同的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7830379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档