Я работаю над Visual Studio о Python Project. У меня есть массив и пользовательский ввод для преобразования hex в dec и dec в bin. Я использую оба из них в моем проекте (hex, dec, bin). Вот базовая выборка моего кода:
dynamicArrayBin = [ ]
dynamicArrayHex = [ ]
hexdec = input("Enter the hex number to binary ");
dynamicArrayHex = [hexdec[idx:idx+2] for idx in range(len(hexdec)) if idx%2 == 0]
binary = '{:08b}'.format(int(dynamicArrayHex[0] , 16))
Итак, когда пользователь вводит 01
для ввода, код дает 00000001
. Я хочу отделить этот результат от элементов 0 0 0 0 0 0 0 1
и поместить в dynamicArrayBin=[]
. Через некоторое время, когда я вызову dynamicArrayBin=[0]
, он должен показать 0
.
Есть ли способ сделать это?
Если вам нужен список двоичных цифр для шестнадцатеричного ввода, нет необходимости сначала разделять входные данные на байты (что и делает ваш код в настоящее время, преобразовывать каждые 2 символа шестнадцатеричного ввода в целое число, охватывающее диапазон 0-255).
Просто преобразуйте весь шестнадцатеричный ввод в целое число и отформатируйте его в двоичном виде:
integer_value = int(hexdec, 16)
byte_length = (len(hexdec) + 1) // 2 # to help format the output binary
binary_representation = format(integer_value, '0{}b'.format(byte_length * 8))
Значение binary_representation
представляет собой строку из символов '0'
и '1'
, а поскольку строки являются последовательностями, нет необходимости превращать их в список, если вы не должны мутировать отдельные символы.
Так:
print(binary_representation[0])
работает и печатает 0
или 1
.
Если у вас есть список, вы можете сделать это со list(binary_representation))
.
Демо-версия:
>>> hexdec = 'deadbeef' # 4 bytes, or 32 bits
>>> integer_value = int(hexdec, 16)
>>> byte_length = (len(hexdec) + 1) // 2 # to help format the output binary
>>> binary_representation = format(integer_value, '0{}b'.format(byte_length * 8))
>>> integer_value
3735928559
>>> byte_length
4
>>> binary_representation
'11011110101011011011111011101111'
>>> binary_representation[4]
'1'
>>> binary_representation[2]
'0'
>>> list(binary_representation)
['1', '1', '0', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '1', '0', '1', '1', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '0', '1', '1', '1', '1']
Если все, что вы хотели, было первым битом шестнадцатеричного значения, то есть более быстрый метод:
if len(hexdec) % 2: # odd number of hex characters, needs a leading 0
hexdec = '0' # doesn't matter what the rest of the hex value is
print('1' if hexdec[0].lower() in '89abcdef' else '0')
потому что первые 4 бита двоичного представления полностью определяются первым шестнадцатеричным символом, а самый первый бит установлен для шестнадцатеричных значений от 8
до F
dynamicArrayBin = [binary[i:i+1] for i in range(len(binary)) if i%1 == 0]
print(int(dynamicArrayBin[0],16))
Результат - это то, что я хочу
Вы можете сделать что-то вроде ниже
hexLst = ['ABC123EFFF', 'ABC123EFEF', 'ABC123EEFF']
binLst = [bin(int(n, 16))[2:] for n in hexLst]
print(binLst)
Что даст вам результат
['1010101111000001001000111110111111111111', '1010101111000001001000111110111111101111', '1010101111000001001000111110111011111111']
то вы можете составить список из этого
dynamicArrayBin=[list(b) for b in binLst]
print(dynamicArrayBin)
Выход
[['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1'], ['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '0', '1', '1', '1', '1'], ['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1']]
dynamicArrayBin = [binary[i:i+1] for i in range(len(binary)) if i%1 == 0]
print(int(dynamicArrayBin[0],16))
. Результат чего я хочу. Тогда другие ребята смогут понять результат.
dynamicArrayBin = [binary[i:i+1] for i in range(len(binary)) if i%1 == 0]
как просто dynamicArrayBin = [[i] for i in binary]
hexdec
на отдельные цифры.