提问人:Niels Sønderbæk 提问时间:6/5/2013 最后编辑:martineauNiels Sønderbæk 更新时间:3/8/2023 访问量:285525
转换为二进制并保持前导零
Convert to binary and keep leading zeros
问:
我正在尝试使用 Python 中的 bin() 函数将整数转换为二进制。但是,它总是删除我实际需要的前导零,因此结果始终是 8 位:
例:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
有没有办法做到这一点?
答:
您可以使用字符串格式化迷你语言(感谢 @Martijn Pieters 的建议)的想法:
def binary(num, length=8):
return format(num, '#0{}b'.format(length + 2))
演示:
print(binary(1))
输出:
'0b00000001'
评论
#
format()
>>> '{:08b}'.format(1)
'00000001'
请参见: 格式规范迷你语言
注意:对于 Python 2.6 或更早版本,您不能在 之前省略位置参数标识符,因此使用:
>>> '{0:08b}'.format(1)
'00000001'
评论
str.format()
format()
0b
str.format
format()
format
str.format()
{}
format()
使用 format()
函数:
>>> format(14, '#010b')
'0b00001110'
该函数只是按照格式规范迷你语言对输入进行格式化。使格式包含前缀,大小格式化输出以适合 10 个字符的宽度,并带有填充;前缀为 2 个字符,另外 8 个字符为二进制数字。format()
#
0b
010
0
0b
这是最紧凑、最直接的选择。
如果要将结果放在较大的字符串中,请使用格式化的字符串文字 (3.6+) 或使用 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'
碰巧的是,即使只格式化单个值(因此不将结果放入更大的字符串中),使用格式化的字符串文字也比使用: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
但只有当紧密循环中的性能很重要时,我才会使用它,因为这样可以更好地传达意图。format(...)
如果您不想要前缀,只需删除并调整字段的长度:0b
#
>>> format(14, '08b')
'00001110'
评论
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
format()
函数的第二个参数放在占位符 {:..}
的冒号之后:
f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
你可以使用这样的东西
("{:0%db}"%length).format(num)
评论
"{:0{l}b}".format(num, l=length)
我正在使用
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
我喜欢这个解决方案,因为它不仅在输出数字时有帮助,而且在您需要将其分配给变量时也有帮助...... 例如:- x = str(datetime.date.today().month).zfill(2) 将在 2 月份返回 x 作为 '02'。
评论
bin(14)
bin(14).zfill(8)
有时你只想要一个简单的一行:
binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])
蟒蛇 3
评论
[ ]
join()
''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
使用 Python 时,您可以使用带有字符串格式的 f-strings:>= 3.6
>>> var = 23
>>> f"{var:#010b}"
'0b00010111'
解释:
var
要格式化的变量:
在此之后的所有内容都是格式说明符#
使用替代形式(添加前缀)0b
0
带零的焊盘10
焊盘的总长度为 10(这包括 2 个字符0b
)b
对数字使用二进制表示
评论
format(var, "#010b")
format
您可以使用以下方法:string.rjust
string.rjust(length, fillchar)
fillchar
是可选的
对于你的问题,你可以这样写
'0b'+ '1'.rjust(8,'0)
所以它将是“0b00000001”
评论
int
int
我喜欢python f-string格式,用于更复杂的事情,例如在format中使用参数:
>>> x = 5
>>> n = 8
>>> print(f"{x:0{n}b}")
00000101
在这里,我打印具有以下格式的变量:我希望它以(二进制)格式填充 to have length = 。有关详细信息,请参阅之前答案中的格式规范迷你语言。x
0
n
b
虽然到处都发布了许多解决方案,但最快的方法(如果你不需要前面的“0b”部分)是将 f'{x:'b'}' 与 .zfill(n) 组合在一起进行填充。
即使需要前导“0b”,也可以使用以下代码添加它:
'0b'+f'{i:b}'.zfill(n)
而且它仍然比使用该方法更快、更具可读性f"{x:0{n}b}"
在此处查找相关的基准测试代码和结果
评论