Python 转换为二进制并保留前导零

Python 转换为二进制并保留前导零,python,binary,formatting,bitwise-operators,Python,Binary,Formatting,Bitwise Operators,我正在尝试使用Python中的bin()函数将整数转换为二进制。但是,它总是删除前导零,这是我实际需要的,因此结果总是8位: 例如: bin(1) -> 0b1 # What I would like: bin(1) -> 0b00000001 有办法吗?您可以使用字符串格式迷你语言: def binary(num, pre='0b', length=8, spacer=0): return '{0}{{:{1}>{2}}}'.format(pre, spacer,

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

例如:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001

有办法吗?

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

def binary(num, pre='0b', length=8, spacer=0):
    return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])
演示:

输出:

'0b00000001'
编辑: 基于@Martijn Pieters的想法

见:


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

>>> '{0:08b}'.format(1)
'00000001'      
使用:

format()
函数只需按照以下命令格式化输入。
#
使格式包含
0b
前缀,
010
大小将输出格式化为10个字符宽,并使用
0
填充;2个字符表示
0b
前缀,另外8个字符表示二进制数字

这是最简洁、最直接的选择

如果要将结果放在较大的字符串中,请使用(3.6+)或使用并将
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'
事实上,即使只是格式化单个值(因此不将结果放入较大的字符串中),使用格式化字符串文字也比使用
format()

但是,只有在紧密循环中的性能很重要时,我才会使用它,因为
格式(…)
可以更好地传达意图

如果不需要
0b
前缀,只需删除
#
并调整字段长度:

>>> format(14, '08b')
'00001110'

你可以用这样的东西

("{:0%db}"%length).format(num)
'0b'+ '1'.rjust(8,'0)
我正在使用

bin(1)[2:].zfill(8)
将打印

'00000001'
您可以使用zfill:

print str(1).zfill(2) 
print str(10).zfill(2) 
print str(100).zfill(2)
印刷品:

01
10
100
我喜欢这个解决方案,因为它不仅在输出数字时有帮助,而且在需要将其分配给变量时也有帮助。。。 e、 g.-
x=str(datetime.date.today().month)。zfill(2)会将2月份的x返回为'02'。

有时您只需要一个简单的一行:

binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])

Python 3

当使用Python
=3.6
时,最干净的方法是使用:

说明:

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

您可以使用python的rjust string方法 语法: string.rjust(长度,fillchar) fillchar是可选的

对于你的问题,你可以这样写

("{:0%db}"%length).format(num)
'0b'+ '1'.rjust(8,'0)

因此它将是“0b00000001”

format()
可以使用时,不需要在这里使用
str.format()
。您缺少
0b
前缀。@MartijnPieters,
str.format
format()
更灵活,因为它允许您同时执行多个变量。我总是忘记
格式
函数甚至存在。无可否认,在这种情况下,它已经足够了。@markransem:没错,当您只使用一个
{}
元素的
str.format()
时,没有其他文本,您没有使用字符串模板,您正在格式化一个值。在这种情况下,只需使用
format()
:-)这不再有效:print(“TCP:Option:Data:{:08b}”).format(Option_Data))TypeError:传递到tuple的格式字符串不受支持。_format__可以使用相同的格式语言为您包含前缀。使用
#
。还有
format()
,这样您就不用再做完整的字符串模板了。请至少为您的代码段使用代码块。如果你真的想让它成为一个好答案,那么也可以添加一些注释,说明为什么这个解决方案能够解决OP问题。你不需要使用不同的字符串格式样式来添加一个可变宽度。只需添加另一个占位符:
“{:0{l}b}”。格式(num,l=length)
另请参见:,尤其是使用n位表示法。不完全相同,但我在搜索答案时遇到了这个问题…zfill的问题是它将二进制字符串视为字符串,并在二进制“b”指示符之前添加零。。。例如
bin(14)
给出了“0b1110”和
bin(14)。zfill(8)
给出了“000b1110”而不是“0b0001110”,这是所需要的。请注意,
[]
不应该需要-
join()
接受生成器表达式<代码>''.join('{0:08b}'。输入中x的格式(ord(x))@ChristophBurschka请注意,由于
str.join()
需要进行两次传递,因此生成器输入在连接之前首先转换为列表。这会对性能造成一些影响,实际上,在这里传递列表理解比传递生成器表达式更好。这是一个如果他们是规则的例外。正是我所寻找的,这种格式对我真的很有帮助。我已经开始学习位操作,我在谷歌上搜索Python中数字的位格式。找到这个。谢谢,很好用。但可能会有点笨重
format(192,'08b')+'.+format(0,'08b')+'.+format(2,'08b')+'.+format(33,'08b')
11000000.00000000.00000010.00100001
@tjt263:这就是为什么我明确声明,如果要将结果放入更大的字符串中,请使用格式化字符串文本(3.6+)或使用
str.format()
,并将格式()的第二个参数放入()占位符的冒号后面的函数
{:…}
:@tjt263:e.g.使用
f{192:08b}.{0:08b}.{2:08b}.{33:08b}
。非常好。单凭解释我永远不会知道你的意思。但现在我看到了你的例子,我可能永远不会忘记。干杯。不,它不是最干净的,除非你对字符串做的比单个占位符更多。否则
格式(var,#010b”)
b
01
10
100
binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])
>>> var = 23
>>> f"{var:#010b}"
'0b00010111'
'0b'+ '1'.rjust(8,'0)