Python 为什么该LFSR不总是正确换档?

Python 为什么该LFSR不总是正确换档?,python,bit-manipulation,bit-shift,shift,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) 为了进行测试,我将这个函数放在一起,它对输

我有一个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。这不应该发生-按位移位最终应该一次将所有内容移到一个字节上,同时从另一端填充新字节

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

为什么字节被损坏,我应该怎么做来修复这个问题

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

当需要精确的结果时,不要使用浮点。使用AND、OR和shifts。

模运算符将其操作数强制转换为浮点?我一直在看文档,但我不知道如何使用位运算符获得整数溢出效果。不,
pow
是问题所在。取一个
1
并将其向左移动,而不是将
2
提升到一个幂!使用类似于
i%(1
returnlong(i%)(1)的方法,你的意思是得到完全相同的结果?是的,我得到完全相同的结果。使用新的干净外壳进行测试。
return long(i % pow(2,32))