我想在Python中翻转float中的特定位。 这似乎很难,因为操作数|仅适用于int。
现在我尝试将float转换为int:Get the "bits" of a float in Python? 但是建议的解决方案似乎不适用于太大的浮动。
答案 0 :(得分:4)
使用struct.pack
和struct.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]