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

时间:2016-01-07 21:42:00

标签: python floating-point bit

我需要用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位。

1 个答案:

答案 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