0

この 32 ビット LFSR 関数があります。

def wu32(i):
    # wrap unsigned 32 bit integer
    return long(i % pow(2,32))

def iterate_lfsr(state):
    return wu32(wu32(0x00000000L - wu32(state & 0x00000001L)) & 0xd0000001L) ^ wu32(state>>1)

テストのために、この関数をまとめました。この関数は、入力数値に対して特定の回数の LFSR 反復 (したがってビット シフト) を実行し、数値を 16 進形式で出力します。

def i_lfsr(state,times):
    cstate = state
    for i in range(times):
        cstate = iterate_lfsr(cstate)
    print str(hex(-1 & cstate))

この LFSR を番号 0x12345678 でテストし、毎回 1 バイトずつシフトしています。

>>> i_lfsr(0x12345678L,0)
0x12345678L
>>> i_lfsr(0x12345678L,8)
0x39123456L
>>> i_lfsr(0x12345678L,16)
0x2d791234L
>>> i_lfsr(0x12345678L,24)
0x87ad7913L
>>> i_lfsr(0x12345678L,32)
0x9727ad78L

ほとんど正常に動作しますが、バイトがわずかに変更されています。0x39 が 0x79 になり、0x2d が 0xad になり、0x12 が 0x13 になり、0x87 が 0x27 になり、0x79 が 0x78 になることに注意してください。これは起こるべきではありません - ビットごとのシフトは、反対側から新しいバイトを埋めながら、最終的に一度に 1 バイト以上すべてを移動する必要があります。

次のシーケンスに近い出力が表示されることを期待していました (もちろん、例です)。

0x12345678
0xef123456
0xbeef1234
0xadbeef12
0xdeadbeef

バイトがマングルされているのはなぜですか? これを修正するにはどうすればよいですか?

4

1 に答える 1

0
return long(i % pow(2,32))

正確な結果が必要な場合は、浮動小数点を使用しないでください。AND、OR、およびシフトを使用します。

于 2012-05-04T02:11:41.310 に答える