3

次のような配列があります。

unsigned char A[16]

この配列を使用して、128 ビットのハードウェア レジスタを表しています。この長いレジスタを使用して、線形フィードバック シフト レジスタ (LFSR、フィボナッチ実装) を実装したいと考えています。この LFSR のフィードバック xnor ゲートに接続する多項式 (またはタップ) は [128, 29, 27, 2, 1] です。

16 ビット LFSR ([16, 14, 13, 11] をタップ) の実装は、Wikipediaから次のように取得できます。

  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 にシフトする必要があります。このシフトを行うための最小限のコーディングは何ですか? ありがとうございました!

4

1 に答える 1

8

シフトするビットを計算するには、1 ビットだけに関心があるため、毎回配列全体をシフトする必要はありません ( Wikipedia& 1の行末に注意してください)。bit =

右シフト量は次のとおりです。

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_tunsigned char の代わりにorを使用するuint64_tことで (プロセッサのワード サイズに応じて)、これをもう少し効率的にすることができますが、原則は同じです。

于 2011-10-20T03:00:44.957 に答える