我需要用
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位.
最佳答案 我认为问题出在这里:
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