Python 为什么该LFSR不总是正确换档?
我有一个32位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) 为了进行测试,我将这个函数放在一起,它对输
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%(1returnlong(i%)(1)的方法,你的意思是得到完全相同的结果?是的,我得到完全相同的结果。使用新的干净外壳进行测试。
return long(i % pow(2,32))