为什么这个LFSR并不总是正确移位?

时间:2012-05-04 02:04:04

标签: python bit-manipulation bit-shift shift

我有这个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迭代(以及因此位移),然后以十六进制格式打印数字。

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

我正在使用数字0x12345678测试此LFSR并每次将其移位一个字节:

>>> 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。这不应该发生 - 按位移位最终应该一次移动一个字节,同时从另一端填充新字节。

我希望看到输出更接近以下序列(当然是一个例子):

0x12345678
0xef123456
0xbeef1234
0xadbeef12
0xdeadbeef

为什么字节被破坏,我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

当需要精确结果时,请勿使用浮点数。使用AND,OR和shift。