Python 转换为二进制并保留前导零
我正在尝试使用Python中的bin()函数将整数转换为二进制。但是,它总是删除前导零,这是我实际需要的,因此结果总是8位: 例如: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,
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
的2个字符)0b
对数字使用二进制表示法b
("{: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)