2011-10-20 2 views
3

에서 바이트 소자 어레이 128 비트 선형 피드백 시프트 레지스터를 구현한다. 이제이 긴 레지스터를 사용하여 선형 피드백 시프트 레지스터 (LFSR, 피보나치 구현)를 구현하려고합니다. 이 LFSR의 피드백 xnor 게이트에 연결되는 다항식 (또는 탭)은 [128, 29, 27, 2, 1]입니다.방법은 다음과 같이 I 배열이 C

Wikipedia에서 16 비트 LFSR ([16, 14, 13, 11]의 탭)을 다음과 같이 구현할 수 있습니다.

unsigned short lfsr = 0xACE1u; 
    unsigned bit; 

    unsigned rand() 
    { 
    bit = ((lfsr >> 0)^(lfsr >> 2)^(lfsr >> 3)^(lfsr >> 5)) & 1; 
    return lfsr = (lfsr >> 1) | (bit << 15); 
    } 

그러나 제 경우에는 한 비트 요소에서 다른 요소로 비트를 이동해야합니다. msb 또는 A [0]은 A 1의 lsb로 이동해야합니다. 이 전환을 수행하기위한 최소 코딩은 무엇입니까? 감사합니다.

답변

8

이동 비트를 계산하려면 매 비트마다 관심이 있으므로 매번 전체 배열을 이동하지 않아도됩니다 (위키 백과의 bit = 행 끝에있는 & 1 참조).

오른쪽 시프트 금액은 다음과 같습니다

128 - 128 = 0 => byte 0 bit 0 
128 - 29 = 99 => byte 12 bit 3 
128 - 27 = 101 => byte 12 bit 5 
128 - 2 = 126 => byte 15 bit 6 
128 - 1 = 127 => byte 15 bit 7 

지금

bit = ((A[0] >> 0) 
    ^(A[12] >> 3) 
    ^(A[12] >> 5) 
    ^(A[15] >> 6) 
    ^(A[15) >> 7)) & 1; 

, 당신이 정말로 비트에 이동해야합니다

A[0] = (A[0] >> 1) | (A[1] << 7); 
A[1] = (A[1] >> 1) | (A[2] << 7); 
// and so on, until 
A[14] = (A[14] >> 1) | (A[15] << 7); 
A[15] = (A[15] >> 1) | (bit << 7); 

당신이 조금을 만들 수 있습니다 부호없는 문자 대신 uint32_t 또는 uint64_t을 사용하면 더 효율적입니다 (프로세서 워드 si에 따라 다름) ze). 그러나 원칙은 동일합니다.

+0

나는 내 마음 속에 똑같은 구조를 가지고있다. 아마도 코드에는별로 도움이되지 않을 것이라고 생각합니다 ... – drdot