转换为二进制并在Python中保持前导零

Nie*_*bæk 129 python binary formatting bitwise-operators

我正在尝试使用Python中的bin()函数将整数转换为二进制.但是,它总是删除我实际需要的前导零,这样结果总是8位:

例:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001
Run Code Online (Sandbox Code Playgroud)

有办法做到这一点吗?

Mar*_*ers 181

使用format()功能:

>>> format(14, '#010b')
'0b00001110'
Run Code Online (Sandbox Code Playgroud)

format()函数只是按照格式规范迷你语言格式化输入.在#使格式包括0b前缀,而010大小格式的输出,以适应在10个字符宽,与0填充; 0b前缀为2个字符,二进制数字为8个.

这是最紧凑和直接的选择.

如果要将结果放在一个更大的字符串中,请在占位符的冒号后面使用str.format()并放置该format()函数的第二个参数{:..}:

>>> value = 14
>>> f'The produced output, in binary, is: {value:#010b}'
'The produced output, in binary, is: 0b00001110'
>>> 'The produced output, in binary, is: {:#010b}'.format(value)
'The produced output, in binary, is: 0b00001110'
Run Code Online (Sandbox Code Playgroud)

如果您不想要format()前缀,只需删除format(...)并调整字段的长度:

>>> import timeit
>>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format")  # use a local for performance
0.40298633499332936
>>> timeit.timeit("f'{v:#010b}'", "v = 14")
0.2850222919951193
Run Code Online (Sandbox Code Playgroud)

  • 正是我所寻找的,这种格式对我来说真的很有帮助.我已经开始学习位操作,我在谷歌搜索Python中的数字位格式.发现了这个.谢谢. (3认同)
  • @tjt263:例如使用`f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"`。 (2认同)

bwb*_*ing 106

>>> '{:08b}'.format(1)
'00000001'
Run Code Online (Sandbox Code Playgroud)

请参阅:格式规范迷你语言


注意对于Python 2.6或更早版本,您不能在之前省略位置参数标识符:,因此请使用

>>> '{0:08b}'.format(1)
'00000001'      
Run Code Online (Sandbox Code Playgroud)

  • 圣......这真是太棒了!谢谢!+1**编辑:**,这也适用于十六进制!'. '{:02X}' 格式(16)` (3认同)
  • 当`format()`这样做时,不需要在这里使用`str.format()`.你错过了'0b`前缀. (3认同)
  • @MartijnPieters,`str.format`比`format()`更灵活,因为它允许你一次做多个变量.我一直忘记`format`功能甚至存在.不可否认,在这种情况下,这是完全足够的. (2认同)

ruo*_*ola 10

使用 Python 时>= 3.6,您可以使用带有字符串格式的f 字符串

>>> var = 23
>>> f"{var:#010b}"
'0b00010111'
Run Code Online (Sandbox Code Playgroud)

解释:

  • var要格式化的变量
  • :此后的所有内容都是格式说明符
  • #使用替代形式(添加0b前缀)
  • 0用零填充
  • 10将总长度填充为 10(这包括 的 2 个字符0b
  • b使用数字的二进制表示形式

  • 不,它不是最干净的,*除非您对字符串进行更多操作而不仅仅是单个占位符*。否则,`format(var, "#010b")` 可以更好地传达*意图*。然而,这是最快的选择。但你已经知道了,对吧,因为我已经在我的答案中涵盖了*你发布的所有内容*。 (2认同)

Pet*_*aro 9

您可以使用字符串格式化迷你语言:

def binary(num, pre='0b', length=8, spacer=0):
    return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])
Run Code Online (Sandbox Code Playgroud)

演示:

print binary(1)
Run Code Online (Sandbox Code Playgroud)

输出:

'0b00000001'
Run Code Online (Sandbox Code Playgroud)

编辑: 基于@Martijn Pieters的想法

def binary(num, length=8):
    return format(num, '#0{}b'.format(length + 2))
Run Code Online (Sandbox Code Playgroud)

  • 可以使用相同的格式化语言为您包含前缀.使用`#`.还有`format()`,它可以节省您完成一个完整的字符串模板. (2认同)

Rus*_* A. 8

我喜欢用 python f 字符串格式化来处理一些更复杂的事情,比如在格式中使用参数:

>>> x = 5
>>> n = 8
>>> print(f"{x:0{n}b}")
00000101
Run Code Online (Sandbox Code Playgroud)

在这里,我使用以下格式打印变量x:我希望将其左侧填充为0具有 length = n,采用b(二进制)格式。有关更多信息,请参阅之前答案中的格式规范迷你语言。