首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Galois LFSR代码解释

Galois LFSR代码解释
EN

Stack Overflow用户
提问于 2013-06-03 15:11:06
回答 1查看 16K关注 0票数 2

我正在尝试理解galois LFSR代码是如何工作的。在维基百科的页面上有一张图片和一个例子。有一个C代码片段。

代码语言:javascript
复制
#include <stdint.h>
uint16_t lfsr = 0xACE1u;
unsigned period = 0;

do {
unsigned lsb = lfsr & 1;  /* Get lsb (i.e., the output bit). */
lfsr >>= 1;               /* Shift register */
if (lsb == 1)             /* Only apply toggle mask if output bit is 1. */
lfsr ^= 0xB400u;        /* Apply toggle mask, value has 1 at bits corresponding
                         * to taps, 0 elsewhere. */
++period;
} while(lfsr != 0xACE1u);

我无法理解维基百科上给出的数字,也无法与代码相关联。切换遮罩的作用是什么?有没有人能解释一下这个操作是如何使用示例位序列和它的移位版本的。我不了解字段,也不理解代码。我在网上查过,但如果不深入领域术语,就找不到任何对该算法的良好解释。请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-03 16:32:14

如果您实际运行代码并添加一些行来查看lfsr移位寄存器变量的中间内容,事情可能会变得更加清晰:

代码语言:javascript
复制
#include <stdint.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    uint16_t lfsr = 0xACE1u;
    unsigned period = 0;
    char s[16+1];

    do {
          unsigned lsb = lfsr & 1;  /* Get lsb (i.e., the output bit). */
          lfsr >>= 1;               /* Shift register */
          if (lsb == 1)             /* Only apply toggle mask if output bit is 1. */
            lfsr ^= 0xB400u;        /* Apply toggle mask, value has 1 at bits corresponding
                                    /* to taps, 0 elsewhere. */
          ++period;

          for (int i = 0; i < 16; i++)
          {
             s[15 - i] = (lfsr & (1 << i)) ? '1' : '0';
          }
          s[16] = '\0';
          printf("\n%10d: %s", period, s);
    } while(lfsr != 0xACE1u);

    return 0;
}

输出如下所示:

代码语言:javascript
复制
     1: 1110001001110000
     2: 0111000100111000
     3: 0011100010011100
     4: 0001110001001110
     5: 0000111000100111
     6: 1011001100010011
     7: 1110110110001001
     8: 1100001011000100
    ....

 65527: 1000000110011100
 65528: 0100000011001110
 65529: 0010000001100111
 65530: 1010010000110011
 65531: 1110011000011001
 65532: 1100011100001100
 65533: 0110001110000110
 65534: 0011000111000011
 65535: 1010110011100001   (= 0xACE1u)

移位运算符">>"将所有位向右移动一位。对于无符号整数,这与除以2相同。"lfsr & 1"返回最低有效位(=位0)。"lfsr ^= 0xB400u"反转lfsr的16位中的4位,因为运算符"^"计算逐位异或。二进制形式的0xB4001011 0100 0000 0000。因此,最高有效位(=位15)、位13、位12和位10被反转。

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

https://stackoverflow.com/questions/16891655

复制
相关文章

相似问题

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