2011-10-20 14 views
3

にバイト素子アレイ128ビット線形フィードバックシフトレジスタを実装します。今私はこの長いレジスタを使って線形フィードバックシフトレジスタ(LFSR、フィボナッチの実装)を実装したいと思います。このLFSRのフィードバックxnorゲートに接続する多項式(またはタップ)は[128,29,27,2,1]です。どのように、次のように私は配列を有する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); 
    } 

私の場合、ビットを1バイトの要素から別の要素にシフトする必要があります。 msbまたはA [0]はA 1のlsbにシフトする必要があります。このシフトを行うための最小限のコーディングは何ですか? ありがとうございました!

答えて

8

シフトするビットを計算するには、1ビットにしか関心がないので、毎回アレイ全体をシフトする必要はありません(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

関連する問題