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