我一直在尝试制作一个线性反馈移位寄存器,但是代码中有一些我无法找到的错误,我试图通过执行do-while的条件来诊断问题处理程序主要操作的循环,即对位进行xoring并将它们移位,可以是以下两种方法之一:
operSeq !=inpSeq
turnCount < 31.
程序要求用户输入5位作为LFSR的初始卡,然后他/她必须输入表示多项式的第二个二进制序列:如果它是x^5+x^4+x^2+x^1+1;
用户应该的序列输入为10111
,如果其中任何一个为1,则检查这些位,它的位置将存储在名为xorArray
的向量中。作为此代码的测试用例,如果用户输入初始卡的10101
和poly位置的01111
,程序将生成无限数量的二进制序列,这些序列不遵循xor正常运行,并且它们也不会在do-while循环指定的31转之后终止!我需要帮助诊断此代码。这是它:
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
int main()
{
// int x, y;
int turnCount = 0;
bitset <5> inpSeq;
bitset <5> polyLoc;
bitset <5> operSeq;
bitset <5> bit;
vector <int> xorArray;
vector <int> keyReg;
cout << "Enter a 5-bit sequence: \n";
cin >> inpSeq;
cout << "Enter poly: \n";
cin >> polyLoc;
for ( unsigned int i = 0; i < polyLoc.size(); i++)
{
if( polyLoc[i] == 1)
{
xorArray.push_back(i);
}
}
cout << "----" << "\n";
operSeq = inpSeq;
keyReg.push_back(inpSeq[0]);
int x = xorArray[0];
bit[4] = operSeq[x];
do
{
for ( unsigned int j = 1; j < xorArray.size() ; j=j+1 )
{
bit[4] = bit[4] ^ operSeq[j];
}
operSeq >>= 1;
operSeq[4] = bit[4];
cout << operSeq << "\n";
keyReg.push_back(operSeq[0]);
turnCount ++;
} while ((operSeq != inpSeq) || (turnCount < 31));
cout << "Generated key is: ";
for (unsigned int k = 0; k < keyReg.size(); k++)
{
cout << keyReg[k];
}
cout << "\n";
cout << "Bit 1 positions: ";
for ( unsigned int g = 0; g < xorArray.size(); g++)
{
cout << xorArray[g];
}
cout << "\n";
cout << "Key length is: " << keyReg.size();
cout << "\n";
cin.get();
}
答案 0 :(得分:1)
你应该使用AND&amp;&amp;运算符而不是OR ||你的do {} while循环运算符。只要两个条件都为真,您就希望循环继续,只要其中一个条件为真,就可以继续循环。
答案 1 :(得分:1)
您的情况是(operSeq != inpSeq) || (turnCount < 31)
。因此,如果其中任何一个条件为真,那么它将继续循环。您希望在turnCount >= 31
时停止循环,因此您的条件应为(operSeq != inpSeq) && (turnCount < 31)
。
答案 2 :(得分:0)
如果你的while循环在turnCount达到31之后没有处理任何东西,那么它就会上升(operSeq!= inSeq)。
在你的同时||声明,如果第一个条件为真,它将不会处理第二个条件。如果(operSeq!= inSeq)或&amp;&amp;他们在一起,如果他们都需要真实地运行。
本来可以做一个评论,但还没有代表:/