我正在尝试学习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表示。

07-26 06:23