我需要用Python翻译一个精确的位。
更确切地说,我需要一个函数,它将双X和位置i作为参数,并返回X的损坏值,其中双精度中的第i位被翻转。
例如:bitflip(34.501,63)
应返回-34.501
(最后一位是符号)。
目前,我有这个功能:
from struct import *
def bitflip(x,pos):
fs = pack('d',x)
bval = list(unpack('BBBBBBBB',fs))
[q,r] = divmod(pos,8)
bval[q-1] ^= 1 << r
fs = pack('BBBBBBBB', *bval)
fnew=unpack('d',fs)
return fnew[0]
但它并没有翻转第i位。
答案 0 :(得分:2)
我认为问题出在这里:
bval[q-1] ^= 1 << r
# ^why q-1?
您使用divmod(1,8)
是(0,1)
(第一个字节 - 从零开始{0},因为数组从0
开始,第二个位,再次从0
开始)。因此,您应该使用q
代替q-1
:
from struct import *
def bitflip(x,pos):
fs = pack('d',x)
bval = list(unpack('BBBBBBBB',fs))
[q,r] = divmod(pos,8)
bval[q] ^= 1 << r
fs = pack('BBBBBBBB', *bval)
fnew=unpack('d',fs)
return fnew[0]
这给出了预期的行为:
>>> bitflip(34.501,63)
-34.501