Python int в двоичную строку? - PullRequest
       157

Python int в двоичную строку?

425 голосов
/ 31 марта 2009

Существуют ли какие-либо стандартные методы Python для преобразования Integer (или Long) в двоичную строку в Python?

В Google существует множество функций dec2bin () ... Но я надеялся, что смогу использовать встроенную функцию / библиотеку.

Ответы [ 32 ]

605 голосов
/ 31 марта 2009

Метод строкового формата Python может принимать спецификацию формата.

>>> "{0:b}".format(37)
'100101'

Формат спецификации документов для Python 2

Формат спецификации документов для Python 3

396 голосов
/ 31 марта 2009

Если вы ищете bin() как эквивалент hex(), он был добавлен в Python 2.6.

Пример:

>>> bin(10)
'0b1010'
55 голосов
/ 31 марта 2009

Python на самом деле имеет что-то уже встроенное для этого, возможность выполнять такие операции, как '{0:b}'.format(42), что даст вам битовый шаблон (в строке) для 42 или 101010.


Для более общей философии ни один язык или библиотека не предоставит своей базе пользователей всего , что они желают. Если вы работаете в среде, которая не обеспечивает именно то, что вам нужно, вы должны собирать фрагменты кода по мере разработки, чтобы вам никогда не приходилось писать одно и то же дважды. Например:

def int_to_bin_string(i):
    if i == 0:
        return "0"
    s = ''
    while i:
        if i & 1 == 1:
            s = "1" + s
        else:
            s = "0" + s
        i //= 2
    return s

, который создаст вашу двоичную строку на основе десятичного значения, при условии, что у Python еще не было более простого способа.

Общая идея - использовать код из (в порядке предпочтения):

  • язык или встроенные библиотеки.
  • сторонние библиотеки с подходящими лицензиями.
  • ваша собственная коллекция.
  • что-то новое, что вам нужно написать (и сохранить в своей коллекции на потом).
36 голосов
/ 17 декабря 2013

Для справки:

def toBinary(n):
    return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])

Эта функция может преобразовывать положительное целое число размером 18446744073709551615, представленное в виде строки '1111111111111111111111111111111111111111111111111111111111111111'.

Его можно изменить, чтобы он служил гораздо большему целому числу, хотя это может быть не так удобно, как "{0:b}".format() или bin().

34 голосов
/ 12 февраля 2014

Если вы хотите текстовое представление без префикса 0b, вы можете использовать это:

get_bin = lambda x: format(x, 'b')

print(get_bin(3))
>>> '11'

print(get_bin(-3))
>>> '-11'

Когда вы хотите n-битное представление:

get_bin = lambda x, n: format(x, 'b').zfill(n)
>>> get_bin(12, 32)
'00000000000000000000000000001100'
>>> get_bin(-12, 32)
'-00000000000000000000000000001100'

В качестве альтернативы, если вы предпочитаете иметь функцию:

def get_bin(x, n=0):
    """
    Get the binary representation of x.

    Parameters
    ----------
    x : int
    n : int
        Minimum number of digits. If x needs less digits in binary, the rest
        is filled with zeros.

    Returns
    -------
    str
    """
    return format(x, 'b').zfill(n)
14 голосов
/ 15 июня 2015

однострочник с лямбда :

>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)

тест:

>>> binary(5)
'101'



РЕДАКТИРОВАТЬ :

но потом :(

t1 = time()
for i in range(1000000):
     binary(i)
t2 = time()
print(t2 - t1)
# 6.57236599922

по сравнению с

t1 = time()
for i in range(1000000):
    '{0:b}'.format(i)
t2 = time()
print(t2 - t1)
# 0.68017411232
13 голосов
/ 20 января 2016

Простой способ сделать это - использовать формат строки, см. page .

>> "{0:b}".format(10)
'1010'

И если вы хотите иметь фиксированную длину двоичной строки, вы можете использовать это:

>> "{0:{fill}8b}".format(10, fill='0')
'00001010'

Если требуется дополнение до двух, то можно использовать следующую строку:

'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)

где n - ширина двоичной строки.

10 голосов
/ 02 мая 2015

Сводка альтернатив:

n=42
assert  "-101010" == format(-n, 'b')
assert  "-101010" == "{0:b}".format(-n)
assert  "-101010" == (lambda x: x >= 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:])(-n)
assert "0b101010" == bin(n)
assert   "101010" == bin(n)[2:]   # But this won't work for negative numbers.

Авторы включают Джон Фухи , Тунг Нгуен , мВч , Мартин Тома . и Мартейн Питерс.

7 голосов
/ 13 ноября 2018

Это для Python 3 и содержит ведущие нули!

print(format(0, '08b'))

enter image description here

5 голосов
/ 27 августа 2015

Используя numpy pack / unpackbits, они ваши лучшие друзья.

Examples
--------
>>> a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> a
array([[ 2],
       [ 7],
       [23]], dtype=uint8)
>>> b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...