Python:在浮点数中翻转一下

时间:2016-01-05 15:42:42

标签: python floating-point bit

我想在Python中翻转float中的特定位。 这似乎很难,因为操作数|仅适用于int。

现在我尝试将float转换为int:Get the "bits" of a float in Python? 但是建议的解决方案似乎不适用于太大的浮动。

2 个答案:

答案 0 :(得分:4)

使用struct.packstruct.unpack。这是在Python 3下测试的。对于Python 2可能存在差异,请参阅doc。

>>> from struct import pack,unpack
>>> fs = pack('f',1.0)               # pack float ('f') into binary string
>>> fs
b'\x00\x00\x80?'

>>> bval = list( unpack('BBBB', fs)) # use list() so mutable list 
>>> bval
[0, 0, 128, 63]
>>> bval[1]=12                # mutate it (byte in middle of mantissa bits)

>>> fs = pack('BBBB', *bval)  # back to a binary string after mutation
>>> fs
b'\x00\x0c\x80?'

>>> fnew=unpack('f',fs)  # and let's look at that slightly altered float value
>>> fnew                 # NB it is a tuple of values, just one in this case
(1.0003662109375,)

unpack需要格式正确的字符串长度。如果您正在使用缓冲区,则可以使用unpack_from( fmt, buffer, offset),其中offset默认为0,且要求buffer 至少

答案 1 :(得分:1)

对于那些对它感兴趣的人,最后的函数是双精度:

<div id="content">
  <div class="g-sharetoclassroom" data-size="32" data-url="..." ></div>
</div>
<script>
  gapi.sharetoclassroom.go("content");
</script>

对于单精度:

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]