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规则加扰,移位后异或的原理是什么?我的理解是否有误?
问题解决与原理说明
代码错误修正
你的代码有两个核心问题:
- 初始值未赋值:变量
a只声明未初始化,导致第一次循环时a是随机垃圾值,后续逻辑全错。需要直接将a初始化为初始状态79。 - 抽位异或逻辑错误:抽头是
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规则加扰为例:
- 明确寄存器位数:
x3+x2说明是3位寄存器(x1是最低位,x3是最高位),初始序列1001可拆分为初始状态100,输出最低位1。 - 移位:寄存器右移一位,
100变成010(最低位移出,高位补0)。 - 反馈计算:抽头x3和x2,对应初始状态的第2位(x3,值1)和第1位(x2,值0),异或得到
1^0=1。 - 补位:把新位
1放到最高位,新状态变成101,下一次输出最低位0。
整个过程中,移位是为了更新寄存器状态,抽头异或则是利用历史状态生成新输入,保证序列的伪随机性和周期性。你的理解没有偏差,只需注意位索引的对应关系(从0还是从1开始计数,这是代码中最容易出错的点)。
内容的提问来源于stack exchange,提问作者Stiven
相关产品推荐
相关产品推荐

