Преобразование целого числа в двоичное в Python

179

Чтобы преобразовать целое число в двоичный файл, я использовал этот код:

>>> bin(6)  
'0b110'

и когда стереть '0b', я использую это:

>>> bin(6)[2:]  
'110'

Что я могу сделать, если я хочу показать 6как 00000110вместо 110?

кузнец
источник
2
Возможный дубликат Python int в двоичный файл?
Мартин Тома,

Ответы:

355
>>> '{0:08b}'.format(6)
'00000110'

Просто, чтобы объяснить части строки форматирования:

  • {} помещает переменную в строку
  • 0 принимает переменную в позиции аргумента 0
  • :добавляет параметры форматирования для этой переменной (иначе она будет представлять десятичную 6)
  • 08 форматирует число до восьми цифр с нулями слева
  • b преобразует число в двоичное представление

Если вы используете версию Python 3.6 или выше, вы также можете использовать f-строки:

>>> f'{6:08b}'
'00000110'
eumiro
источник
7
Первый 0означает 0thаргумент format. После форматирования двоеточия второе 0означает заполнение нулями до 8 пробелов, а bдля двоичного
jamylak
@Aif: Кроме того , посмотрите на стандартной документации docs.python.org/library/...
pepr
19
Это может быть упрощено с format() функцией : format(6, '08b'); функция принимает значение (к {..}которому относится слот) и спецификацию форматирования (что бы вы не указали после :в строке форматирования).
Мартин Питерс
4
'{0:08b}'.format(-6)-> '-0000110'. Что делать, если вы не хотите знак? struct? -6%256?
n611x007
1
@ AK47 Да, начиная с Pythoon 2.6, вы можете писать int-константы в двоичной форме с префиксом 0b или 0B: 0b00000110
Денис Барменков
102

Просто еще одна идея:

>>> bin(6)[2:].zfill(8)
'00000110'

Более короткий путь с помощью интерполяции строк ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'
mshsayem
источник
7
Обратите внимание, что это решение быстрее принятого . Какое решение является более ясным (или, смею сказать, Pythonic), вероятно, зависит от личного вкуса.
эфир
Я все еще изучаю суть питоничности, но это, очевидно, гораздо более универсально. Сначала я был рад увидеть принятое решение с его элегантным объяснением, но встревожен тем, что объект, вызываемый для выполнения методов, был записан в виде одной строки со всеми встроенными спецификациями, исключая участие переменных в таких вещах, как желаемая длина из цепочки битов. Это решает это полностью и настолько интуитивно понятно (по крайней мере, для Python 2), что нет необходимости объяснять каждый символ!
Post169
Не работает для отрицательного целого числа bin(-6)[2:].zfill(8)читается как'0000b110'
jlandercy
20

Немного сложный метод ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
Собела
источник
1
Хороший метод. Но я не мог понять, что делает эта часть вашего кода: str ((x >> i) & 1)
Gregory
2
@Gregory: он сдвигает биты xвправо и с помощью AND 1, эффективно выделяя один бит (0 или 1) за раз.
usr2564301
16

Просто используйте функцию форматирования

format(6, "08b")

Общая форма

format(<the_integer>, "<0><width_of_string><format_specifier>")
тот самый
источник
1
Да, мне нравится этот, он простой и один из самых быстрых :-) 1000000 loops, best of 3: 556 ns per loop
SebMa
10

Ответ eumiro лучше, но я просто публикую это для разнообразия:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
источник
3
Хех. Это так глубоко неправильно, я должен был это отозвать. Интерпретация цифр как десятичных является хитрой. Еще хуже:'%08x' % int(bin(6)[2:], 16)
Безумный физик
6

.. или если вы не уверены, что это всегда должно быть 8 цифр, вы можете передать его в качестве параметра:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'
thebjorn
источник
5

numpy.binary_repr(num, width=None) имеет аргумент волшебной ширины

Соответствующие примеры из документации, указанной выше:

>>> np.binary_repr(3, width=4)
'0011'

Дополнение к двум возвращается, когда входное число отрицательно и указана ширина:

>>> np.binary_repr(-3, width=5)
'11101'
Том Хейл
источник
4

Going Old School всегда работает

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))
Шадрак Кимутай
источник
number=number/2дает поплавок, так что number=number//2швы лучше, также я бы заменил number=number//2на number//=2и b=b+"0"сb+="0"
Брамбор
кроме того, у вас нет нуля в качестве требуемого OP
Brambor
1
('0' * 7 + bin(6)[2:])[-8:]

или

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
зергов
источник
2
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Nic3500
0

Предполагая, что вы хотите проанализировать количество цифр, используемых для представления, из переменной, которая не всегда постоянна, хорошим способом будет использование numpy.binary.

может быть полезно, когда вы применяете бинарный к силовым установкам

import numpy as np
np.binary_repr(6, width=8)
ама
источник
0

Лучший способ - указать формат.

format(a, 'b')

возвращает двоичное значение в формате строки.

Чтобы преобразовать двоичную строку обратно в целое число, используйте функцию int ().

int('110', 2)

возвращает целочисленное значение двоичной строки.

Pranjalya
источник
Лучше было бы форматировать (a, '08b'), чтобы получить формат, который хотел пользователь.
ZSG
0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
Дмитрий Брюханов
источник