Я пытаюсь преобразовать целое число в двоичное с помощью функции bin () в Python. Однако он всегда удаляет начальные нули, которые мне действительно нужны, так что результат всегда будет 8-разрядным:
Пример:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Есть ли способ сделать это?
python
binary
formatting
bitwise-operators
Нильс Сённербек
источник
источник
Ответы:
Используйте
format()
функцию :format()
Функция просто форматирует ввод следующего за спецификацией формата мини - языка . Формат#
заставляет включать0b
префикс, а010
формат форматирует вывод, чтобы он соответствовал ширине в 10 символов с0
отступом; 2 символа для0b
префикса, остальные 8 для двоичных цифр.Это самый компактный и прямой вариант.
Если вы помещаете результат в строку большего размера, используйте форматированный строковый литерал (3.6+) или используйте
str.format()
второй аргумент дляformat()
функции после двоеточия заполнителя{:..}
:Как это бывает, даже для простого форматирования одного значения (то есть без помещения результата в большую строку) использование форматированного строкового литерала быстрее, чем использование
format()
:Но я бы использовал это только в том случае, если производительность в узком цикле имеет значение, так как
format(...)
лучше передает намерение.Если вам не нужен
0b
префикс, просто опустите#
и отрегулируйте длину поля:источник
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
второй аргумент для функции format () после двоеточия заполнителя{:..}
:f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
.См .: Спецификация формата Mini-Language
Примечание для Python 2.6 или старше, вы не можете опустить идентификатор позиционного аргумента раньше
:
, поэтому используйтеисточник
str.format()
здесь, когдаformat()
будет делать. Вам не хватает0b
префикса.str.format
более гибкий, чемformat()
потому, что он позволяет вам делать несколько переменных одновременно. Я постоянно забываю, что этаformat
функция даже существует. По общему признанию это совершенно адекватно в этом случае.str.format()
с одним{}
элементом, без другого текста, вы не используете строковые шаблоны, вы форматируете одно значение . В этом случае просто используйтеformat()
. :-)Я использую
распечатает
источник
Вы можете использовать мини-язык форматирования строк:
Демо-версия:
Вывод:
РЕДАКТИРОВАТЬ: на основе идеи @Martijn Pieters
источник
#
. Существует такжеformat()
, что избавляет вас от необходимости делать полный шаблон строки.При использовании Python
>= 3.6
самый простой способ - использовать f-строки с форматированием строк :Объяснение:
var
переменная для форматирования:
все после этого является спецификатором формата#
используйте альтернативную форму (добавляет0b
префикс)0
блокнот с нулями10
колодки на общую длину от 10 (включая 2 символа для0b
)b
использовать двоичное представление для числаисточник
format(var, "#010b")
общение намерение намного лучше. Это, однако, самый быстрый вариант. Но вы уже знаете это, верно, потому что я уже охватил все, что вы опубликовали в моем ответе.Иногда вам просто нужен простой вкладыш:
Python 3
источник
[ ]
не нужно -join()
принимает выражение генератора.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
необходимо выполнить два прохода, вход генератора сначала преобразуется в список перед присоединением. Это немного сказывается на производительности, и на самом деле здесь лучше передать понимание списка, а не выражение генератора. Это один, если их исключения из правил.Вы можете использовать что-то вроде этого
источник
"{:0{l}b}".format(num, l=length)
Вы можете использовать метод строкового синтаксиса Python: string.rjust (length, fillchar) fillchar необязателен
и для вашего вопроса вы пишите так
так что будет 0b00000001
источник
int
двоичного представления в текстовое; Вы даже не начинаете сint
.Вы можете использовать zfill:
печатает:
Мне нравится это решение, так как оно помогает не только при выводе числа, но и когда вам нужно присвоить его переменной ... например - x = str (datetime.date.today (). Month) .zfill (2) верните x как '02' для месяца фев.
источник
bin(14)
дает `'0b1110'` иbin(14).zfill(8)
дает `'000b1110'` not `'0b00001110'`, что и нужно