Преобразование битов вектора в десятичное целое

Я пытаюсь преобразовать биты вектора в десятичное целое число. Моя программа представляет собой регистр сдвига с переменной линейной обратной связью. Сначала он запрашивает у пользователя длину начальной последовательности LFSR, затем он запрашивает саму последовательность и положение битов, которые должны быть зарезервированы. Поэтому, если я ввел 4 для длины последовательности, 1110 для битовой последовательности и 20 для полинома, ключ — 0111100, он сохраняется в векторе keyReg, я попытался преобразовать его в десятичное число, используя условие for:

for ( unsigned int i = 0; i < keyReg.size(); i++)
{
if (keyReg[i]==1)
{
key = key+(2^i);
cout << key << "\n";
}
}

Но это не дает правильный десятичный эквивалент 0111100. Что делать?
Вот полная программа:

#include <iostream>  //Standard library.
#include <boost/dynamic_bitset.hpp>    //Library for 10 handling.
#include <vector>    //Variable size array.
#include <algorithm> //We use sorting from it.

using namespace std;

int main()
{
int y = 0;
int turnCount = 0;
int count1 = 0, count0 = 0;
int xx = 0;
int polyLoc;
int key = 0;
boost::dynamic_bitset<> inpSeq(5);
boost::dynamic_bitset<> operSeq(5);
boost::dynamic_bitset<> bit(5);
vector <int> xorArray;
vector <int> keyReg;
cout << "What is the legnth of the sequence?";
cin >> xx;
inpSeq.resize(xx);
operSeq.resize(xx);
bit.resize(xx);
cout << "Enter a bit sequence: \n";
cin >> inpSeq;
int seq_end = inpSeq.size() - 1;
cout << "Enter polynomial:";
cin >> polyLoc;
while(polyLoc>0)
{
xorArray.push_back(polyLoc%10);
polyLoc/=10;
}
sort(xorArray.rbegin(), xorArray.rend());
cout << "\n";
operSeq = inpSeq;
keyReg.push_back(inpSeq[0]);
int x = xorArray[0];
do {
for (unsigned int r = 1; r < xorArray.size(); r++)
{
bit[seq_end] = operSeq[x];
y = xorArray[r];
bit[seq_end] = bit[seq_end] ^ operSeq[y];
}
operSeq >>= 1;
operSeq[seq_end]  = bit[seq_end];
keyReg.push_back(operSeq[0]);
turnCount ++;
cout << operSeq << "\n";
}
while ((operSeq != inpSeq) && (turnCount < 1024));
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";
for ( unsigned int i = 0; i < keyReg.size(); i++)
{
if (keyReg[i]==1)
{
count1++;
}
else {
count0++;
}
}
cout << "Number of 0's: " << count0 << "\n";
cout << "Number of 1's: " << count1 << "\n";
if ( keyReg.size()%2 ==0)
{
cout << "key length is even. \n";
if (count1==count0)
{
cout << "Key is perfect! \n";
}
else {
cout << "Key is not perfect! \n";
}
}
else
{
cout << "key length is odd. \n";
if  ((count1==count0+1) || (count0==count1+1))
{
cout << "Key is perfect! \n";
}
else {
cout << "Key is not perfect! \n";
}
}
for ( unsigned int i = 0; i < keyReg.size(); i++)
{
if (keyReg[i]==1)
{
key = key+(2^i);
cout << key << "\n";
}
}
cout << "Key is " << key << "\n";
cin.get();
}

-1

Решение

Я думаю, что вы имели в виду:

for ( unsigned int i = 0; i < keyReg.size(); i++)
{
if (keyReg[i]==1)
{
key = key+(1 << i); // this is 2^i
cout << key << "\n";
}
}

^ это побитовый оператор для XOR поэтому код был «действительным» с точки зрения компилятора.

Почему это работает:

Я не могу найти соответствующий вопрос, но «(1 << i)«было объяснено где-то еще. 1 рассматривается как целое число затем operator<< на целое число — побитовое смещение влево ( i места).

Так что это делает 000001 и сдвигает его влево, например когда i 3 это производит 001000, Эффективно производить 2^i целое число.

Конечно, можно использовать что-то более явное, однако станд :: пау определяется только для типов с плавающей запятой, поэтому необходимо использовать некоторые преобразования.

(1 << i) также создает некоторые проблемы безопасности. Вам нужно позаботиться о типе значений, которые вы используете для сдвига (их размер), и о значении, которое вы используете для сдвига, записи (1<<128) может дать некоторые неожиданные результаты. Во всяком случае, это лучший способ получить 2^i для большинства случаев ИМО.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector