我找到了几种将整数和浮点数值转换为二进制的方法,它们各自都有问题。我需要将介于0和10000之间的整数/浮点数作为输入,将其转换为一个16位(确切地说)的二进制字符串,随机操作其中的位,并根据参数再次转换为整数/浮点数。
然而,我一直在使用以下代码:
然而,我一直在使用以下代码:
def convert_to_binary(value):
'''
Converts a float to a 16-bit binary string.
'''
[d] = struct.unpack('>Q', struct.pack('>d', value))
return str('{:016b}'.format(d))
def convert_back(bin_num):
'''
Converts binary string to a float.
'''
print type(bin_num)
print bin_num
bf = int_to_bytes(int(bin_num, 2), 8) # 8 bytes needed for IEEE 754 binary64.
print struct.unpack('>d', bf)[0]
return struct.unpack('>d', bf)[0]
# return struct.unpack('d', struct.pack('Q', bin_num))[0]
#bin_num.pack('B*').unpack('g').first
def int_to_bytes(n, minlen=0): # Helper function
'''
Turns integer/long to byte string.
'''
nbits = n.bit_length() + (1 if n < 0 else 0) # +1 for any sign bit.
nbytes = (nbits+7) // 8 # Number of whole bytes.
b = bytearray()
for _ in range(nbytes):
b.append(n & 0xff)
n >>= 8
if minlen and len(b) < minlen: # Zero padding needed?
b.extend([0] * (minlen-len(b)))
return bytearray(reversed(b)) # High bytes first.
最终结果如下(因为无法从终端复制粘贴,所以这是图片形式):
我知道有不同类型的二进制(有符号/无符号,不同的位数等),但我需要输出的是我认为的无符号短整型...我的所有数字都是正数值,并且为了进行后续的位操作,它们需要恰好16位长 -->(如果它们是浮点数值,我可以使用二进制的额外位数,但只需修改前16位,其后的位数就是小数点后面的数字,对吗?)
首先,我应该为浮点输入和整数输入编写两个函数吗?
其次,我如何更改我的代码以实现所需的输出,而不仅仅是使用pop
等方法将二进制长度减少到16位?