我有一个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迭代(因此是位移位),然后以十六进制格式打印数字。在
^{pr2}$我测试这个编号为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
为什么字节被损坏,我应该怎么做来修复这个问题?在
当需要精确结果时,不要使用浮点。使用AND、OR和shifts。在
相关问题 更多 >
编程相关推荐