我正在尝试学习right >>
和left <<
如何在c ++中转换操作。我已经在互联网上阅读了一些文章,并在这里阅读了一些主题,但是我仍然感到困惑。
我正在尝试根据用户输入来编码LFSR(线性反馈移位寄存器),该用户输入应给出长度,种子和多项式抽头位置作为LFSR代码的输入。
代码如下:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
string seed;
unsigned int length, pos;
cout << "Type the length and the seed" << endl;
cin >> length >> seed;
cout << "Polynomial tap positions" << endl;
cin >> pos;
//Creating array with the LFSR size
unsigned int *sizee = new unsigned int[length];
//Convert the seed from char to int
for (unsigned int i = 0; i < length; i++) {
sizee[i] = seed[i] - '0';
}
//Shifting
unsigned int seq = std::pow(2,length)-1;
for (unsigned int i = 1; i <= seq ; i++) {
//Shift Operation here
//Show user the value
}
delete[] sizee;
return 0;
}
我如何才能将长度为5的LFSR中的种子00001(例如种子00001)和分接位置(Xor位置)为5和3(x ^ 5 + x ^ 3 + 1)向右移动?我希望获得类似以下内容的东西:00001> 10000> 01000> 00100> 10010,依此类推,直到循环结束,以斐波那契作为体系结构类型。
最佳答案
如果要在计算机上将LFSR编码为整数,则需要首先了解LFSR和整数使用的表示形式。有两个重要的问题/差异:
LFSR通常以1开头的数字编号
i对应于多项式中的xi
整数通常以0开头的位编号,而i对应的值为2i
传统上,LFSR的左边是第1位,右边是最高位
整数通常以big-endian形式编写,第0位在右侧,最高位在左侧
当您将整数用于LFSR时,这些将导致两件重要的事情:
LFSR的位i变为整数的位i-1
LFSR的右移变为整数的左移。
因此您的基本LFSR步骤变为:
seed = (seed << 1) | parity(seed | polynomial)
其中
seed
是LFSR的内容(加上您的整数大小大于LFSR长度时先前移出的额外位),polynomial
是抽头位-为每个xi中的i-1设置整数的整数parity
是一个用于计算整数中所有位的异或的函数-可以在大多数CPU上使用标志技巧或单个指令来完成,但是没有简单的方法可以用C表示。