2014-04-28 4 views
-1

에 벡터의 비트를 변환. 내 프로그램은 가변 선형 피드백 시프트 레지스터입니다. 처음에는 사용자에게 LFSR의 초기 시퀀스 길이를 묻고, 시퀀스 자체와 비트의 위치를 ​​묻습니다. I 시퀀스, 비트 시퀀스에 대한 1110 다항식 (20)의 길이에 4를 입력한다면 키가이 벡터 keyReg에 저장되어, 0,111,100이고, I는 상태에 대한 사용하여 십진수로 변환 시도 :내가 진수 정수로 벡터의 비트를 변환하려고 진수 정수

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(); 
} 

답변

2

난 당신이 의미 생각 :

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

^bitwise operator for XOR 그래서 코드 뷰의 컴파일러의 관점에서 "유효"이었다 다음은 전체 프로그램입니다. 그것이 작동하는 이유

:

내가 관련 질문을 찾을 수 없습니다 "가 (1 << i)는"다른 곳에서 설명했다. 1은 정수로 처리됩니다. 그런 다음 정수의 operator<<은 비트 왼쪽 시프트입니다 (i 기준).

그래서, 예를 000001하게하고 왼쪽으로 이동 i이 3 일 때 001000을 생성합니다. 효과적으로 2^i 정수를 생성합니다.

물론 더 명확한 것을 사용할 수도 있지만 std::pow은 부동 소수점 유형에만 정의되어 있으므로 일부 변환을 사용해야합니다.

(1 << i)도 몇 가지 안전 문제를 제기합니다. 이동에 사용하는 값 ​​유형 (크기) 및 이동에 사용하는 값을 처리해야 할 경우 (1<<128)을 작성하면 예기치 않은 결과가 발생할 수 있습니다. 어쨌든 대부분의 경우 IMO에 2^i을 얻는 가장 좋은 방법입니다.

+0

좋아요,하지만 어떻게 (1 << i)는 2의 힘과 같습니다. –

+0

@MooingDuck 음, 처음에는 관련 코드 샘플을 추출했고, 때로는 스프레드 시트를 사용하기 때문에 사람들은 지수화에 '^'를 사용하는 경향이 있습니다. – luk32

+0

@MohamedAhmed 나는 그것이 작동하는 부분을 추가했습니다. – luk32