You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现Linear-feedback shift register抽头(x7+x6+x2)问题求助

线性反馈移位寄存器(LFSR)抽头实现问题解答

问题描述

需要在C++中实现抽头为x7+x6+x2的线性反馈移位寄存器,对第7、6、2位异或后将结果作为下一次移位的首位,初始状态为79。但编写的代码输出不符合预期,同时想理解移位操作和抽头异或的原理。

编写的代码

int main() {
    int a,b = 79;
    cout << " b = " << bitset<7>(b) << std::endl;
    int newbyte;
    for (int i = 1; i<11; i++){

//此处尝试用异或生成新位,但不清楚逻辑
        newbyte = ((((a >> 6) ^ (a >>5) ^ (a >>1) ^ a ) & 0x01 ) << 6 ) | (a >> 1);
        a = (a >> 1) | (newbyte << 6);

        cout << "Iteration " << i << " of a = " << bitset<7>(a) << std::endl;}

}

输出对比

预期输出

1 0 0 1 1 1 1
0 1 0 0 1 1 1
1 0 1 0 0 1 1
1 1 0 1 0 0 1
1 1 1 0 1 0 0
0 1 1 1 0 1 0
0 0 1 1 1 0 1
1 0 0 1 1 1 0
0 1 0 0 1 1 1
1 0 1 0 0 1 1

实际输出

Iteration 1 of a = 0000000
Iteration 2 of a = 0000000
Iteration 3 of a = 0000000
Iteration 4 of a = 0000000
Iteration 5 of a = 0000000
Iteration 6 of a = 0000000
Iteration 7 of a = 1000000
Iteration 8 of a = 0100000
Iteration 9 of a = 0010000
Iteration 10 of a = 0001000

额外疑问

移位操作如何帮助对特定抽头进行异或?比如序列1001按x3+x2规则加扰,移位后异或的原理是什么?我的理解是否有误?


问题解决与原理说明

代码错误修正

你的代码有两个核心问题:

  1. 初始值未赋值:变量a只声明未初始化,导致第一次循环时a是随机垃圾值,后续逻辑全错。需要直接将a初始化为初始状态79。
  2. 抽位异或逻辑错误:抽头是x7+x6+x2,对应7位寄存器的位索引(从0开始计数)为:
    • x7是最高位(索引6),x6是索引5,x2是索引1(这里的x2是从最低位x1开始数的第2位)。
    • 正确的新位计算是这三个位的异或,而非你代码中的四个位异或;同时移位逻辑需要简化:右移一位后,把新位补到最高位。

修正后的代码:

#include <iostream>
#include <bitset>

using namespace std;

int main() {
    int a = 79; // 直接初始化a为初始状态79
    cout << "Initial state = " << bitset<7>(a) << endl;
    
    for (int i = 1; i <= 10; i++) {
        // 提取x7(bit6)、x6(bit5)、x2(bit1),异或得到新位
        int new_bit = ((a >> 6) ^ (a >> 5) ^ (a >> 1)) & 0x01;
        // 右移一位,把新位放到最高位
        a = (a >> 1) | (new_bit << 6);
        
        cout << "Iteration " << i << ": " << bitset<7>(a) << endl;
    }
    return 0;
}

运行这段代码即可得到你预期的输出。

移位与抽头异或的原理

LFSR的核心是移位+反馈,移位操作的作用是让寄存器中的每一位依次向后移动,同时通过抽头选取特定位置的位进行异或,生成新的输入位补到寄存器的开头(最高位),以此生成伪随机序列。

以你提到的1001按x3+x2规则加扰为例:

  1. 明确寄存器位数:x3+x2说明是3位寄存器(x1是最低位,x3是最高位),初始序列1001可拆分为初始状态100,输出最低位1。
  2. 移位:寄存器右移一位,100变成010(最低位移出,高位补0)。
  3. 反馈计算:抽头x3和x2,对应初始状态的第2位(x3,值1)和第1位(x2,值0),异或得到1^0=1。
  4. 补位:把新位1放到最高位,新状态变成101,下一次输出最低位0。

整个过程中,移位是为了更新寄存器状态,抽头异或则是利用历史状态生成新输入,保证序列的伪随机性和周期性。你的理解没有偏差,只需注意位索引的对应关系(从0还是从1开始计数,这是代码中最容易出错的点)。

内容的提问来源于stack exchange,提问作者Stiven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:24:15