Я нашел несколько способов преобразовать значения Integer и Float в двоичные, и у каждого из них есть свои проблемы. Мне нужно взять целочисленное значение / число с плавающей запятой между значениями от 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?