2011-10-20 88 views
3

我有一個數組如下,如何實現與字節元件陣列128位線性反饋移位寄存器使用C

unsigned char A[16]

我使用此陣列來表示128位的硬件寄存器中。現在我想用這個長寄存器實現一個線性反饋移位寄存器(LFSR,Fibonacci實現)。連接到該LFSR的反饋xnor門的多項式(或抽頭)是[128,29,27,2,1]。

可以從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_tuint64_t而不是無符號字符更有效(取決於處理器字si澤),但原則是一樣的。

+0

我在我腦海中的結構是一樣的。我認爲在代碼中可能沒有多少東西... – drdot