Не уверен, что, если есть лучший способ, но это работает (в предположении, что числа всегда 16-бит):
# Takes a hex-encoded 16-bit number and returns a binary representation with
# leading zeros and underscores as a nibble separator.
def binary_representation(string):
return '0b' + '_'.join(
''.join(nibble) for nibble in zip(*([iter('{:>016b}'.format(int(string, 16)))]*4)))
assert binary_representation('0x1234') == '0b0001_0010_0011_0100'
zip
трюк хороший один, который исходит от grouper
example in the Python docs. Этот вызов по существу испускает [('0', '0', '0', '1'), ('0', '0', '1', '0'), ...]
. Оттуда вам просто нужно перевернуть каждый кусок в одну строку, а затем присоединить их все с подчеркиваниями.
Другим интересным битом здесь является формат {:>016b}
, который дает вам выровненное по правому краю двоичное представление числа. Если вам нужно поддерживать разные размеры чисел, это часть, которую вам нужно будет изменить.
UPDATE
Учитывая, что ваш номер начинается как строки, такой подход еще проще, вдохновленный @ ответ Joran, но без таблицы перекодировки.
def binary_representation(string):
return '0b' + '_'.join(['{:>04b}'.format(int(d, 16)) for d in string[2:]])
Какие способы вы пытались до сих пор? – smarx
Знаете ли вы о циклах, разрезаниях и списках? Если вы это сделаете, я думаю, вы можете сделать это в строке или двух. –
Я преобразовал строку в бит-массив, а затем зациклил над битным массивом и добавив «_» на каждый четвертый элемент, а затем распечатал его. Очень похоже на функцию c. – Romeo