Python: 在双精度中翻转一个精确位

Python: flip a precise bit in a double

我需要用 Python 翻转一个精确的位。

更准确地说,我需要一个函数,它将双精度 X 和位置 i 和 return X 的损坏值作为参数,其中双精度中的第 i 位已被翻转.

例如:bitflip(34.501,63)应该return-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