Перетворення цілого числа в двійкове в python


179

Для того, щоб перетворити ціле число у бінарне, я використав цей код:

>>> bin(6)  
'0b110'

і коли стерти '0b', я використовую це:

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

Що я можу зробити , якщо я хочу , щоб показати , 6як 00000110замість 110?


Відповіді:


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

Просто для пояснення частин рядка форматування:

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

Якщо ви використовуєте версію Python 3.6 або вище, ви також можете використовувати f-рядки:

>>> f'{6:08b}'
'00000110'

7
Перший 0означає 0thаргумент до format. Після двокрапки є форматуванням, друге 0означає нульове заповнення до 8 пробілів, а bдля двійкового
джамілак

@Aif: Також перегляньте стандартну документацію docs.python.org/library/…
5

19
Це може бути спрощено з format() функцією : format(6, '08b'); функція приймає значення (до якого {..}застосовується слот) і специфікацію форматування (що б ви не додали після :в рядку форматування).
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'. що робити, якщо ви не хочете ознаки? struct? -6%256?
n611x007

1
@ AK47 Так, оскільки Pythoon 2.6 ви можете записувати int-константи у двійковій формі з префіксом 0b або 0B
Денис Барменков

102

Ще одна ідея:

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

Коротший шлях за допомогою рядкової інтерполяції ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'

7
Зауважте, що це рішення швидше прийнятого . Яке рішення більш чітке (чи, смію сказати, піфонічне), мабуть, питання особистого смаку.
Повітря

Я досі вивчаю суть пітонічності, але це явно набагато більш універсально. Я спочатку був радий бачити прийняте рішення з його елегантним поясненням, але занепокоєний тим, що об'єкт, закликаний виконувати методи, був записаний у вигляді однієї рядка з усіма вбудованими специфікаціями, що виключає залучення змінних у такі речі, як потрібна довжина бітової струни. Це вирішує це повністю і настільки інтуїтивно зрозуміло (принаймні для Python 2), що не потрібно пояснювати кожного персонажа!
Пост169,

Не працює для негативного цілого 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)
Григорій,

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

3
Хе. Це просто так глибоко неправильно, що мені довелося це підтвердити. Інтерпретація цифр як десяткових є хитромудрим. Ще гірше:'%08x' % int(bin(6)[2:], 16)
Божевільний фізик

6

.. або якщо ви не впевнені, що це завжди має бути 8 цифр, ви можете передати це як параметр:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

5

numpy.binary_repr(num, width=None) має аргумент магічної ширини

Відповідні приклади з документації, зв'язаної вище:

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

Доповнення двох повертається, коли вхідне число від'ємне і вказана ширина:

>>> np.binary_repr(-3, width=5)
'11101'

4

Перехід на стару школу завжди працює

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дає float, тому number=number//2шви краще, також я б замінив number=number//2на number//=2і b=b+"0"зb+="0"
Brambor

Крім того, у вас немає 0 прокладки, як вимагається ОП
Брамбор

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)

повертає ціле значення двійкового рядка.


Краще буде формат (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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.