8

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

27

Проблема: Как я могу преобразовать целое число в двоичную строку в Python?

Пример:

37   →   '100101'

Необходимо получить двоичное представление целого числа в виде строки. Буду рад любым советам или примерам кода!

5 ответ(ов)

0

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


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

define intToBinString, receiving intVal:
    if intVal is equal to zero:
        return "0"
    set strVal to ""
    while intVal is greater than zero:
        if intVal is odd:
            prefix "1" to strVal
        else:
            prefix "0" to strVal
        divide intVal by two, rounding down
    return strVal

Этот код будет составлять двоичную строку на основе десятичного значения. Имейте в виду, что это общий псевдокод и он может не быть самым эффективным способом решения задачи, но при тех итерациях, которые вы предложили, это не должно сильно сказаться на производительности. Он просто служит ориентиром для возможной реализации.

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

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

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

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

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

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

Когда вам требуется представление с фиксированным количеством битов:

get_bin = lambda x, n: format(x, 'b').zfill(n)

print(get_bin(12, 32))
>>> '00000000000000000000000000001100'

print(get_bin(-12, 32))
>>> '-00000000000000000000000000001100'

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

def get_bin(x, n=0):
    """
    Получить двоичное представление x.

    Параметры
    ----------
    x : int
    n : int
        Минимальное количество цифр. Если x требует меньше цифр в двоичном представлении, оставшиеся заполняются нулями.

    Возвращает
    -------
    str
    """
    return format(x, 'b').zfill(n)

Надеюсь, это поможет!

0

Функция, которую вы привели, предназначена для преобразования положительного целого числа в двоичное представление. Вот как она работает:

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

Она принимает число n и возвращает его двоичное представление в виде строки. Функция поддерживает числа вплоть до 18446744073709551615, что соответствует строке '1111111111111111111111111111111111111111111111111111111111111111'.

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

Также можно модифицировать вашу функцию для работы с числовыми значениями больше, чем 18446744073709551615, но это потребует изменения логики представления результата.

0

Вы можете использовать однострочную функцию с lambda для получения двоичного представления числа:

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

Пример использования:

>>> binary(5)
'101'

EDIT: Однако, производительность функции оставляет желать лучшего:

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

Таким образом, использование встроенной функции '{0:b}'.format(i) оказывается значительно быстрее, чем рекурсивная реализация с lambda.

0

Предыдущие ответы в основном использовали функцию format(), поэтому вот пример реализации с использованием f-строк.

integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')

Вывод:

00111

Для вашего удобства, вот ссылка на документацию Python по форматированным строковым литералам: https://docs.python.org/3/reference/lexical_analysis.html#f-strings.

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