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

2025-03-04 08:25:00
admin
原创
92
摘要:问题描述:我正在尝试使用 Python 中的 bin() 函数将整数转换为二进制。但是,它总是删除前导零,而这实际上是我需要的,因此结果始终是 8 位:例子:bin(1) -> 0b1 # What I would like: bin(1) -> 0b00000001 有办法吗?解决方案 1:使...

问题描述:

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

例子:

bin(1) -> 0b1

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

有办法吗?


解决方案 1:

使用以下format()函数:

>>> format(14, '#010b')
'0b00001110'

该函数只是按照格式规范迷你语言format()格式化输入。使格式包括前缀,大小格式化输出以适合 10 个字符宽度,并带有填充;2 个字符为前缀,另外 8 个为二进制数字。#`0b0100`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'

解决方案 2:

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

参见:格式规范微语言


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

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

解决方案 3:

我正在使用

bin(1)[2:].zfill(8)

将打印

'00000001'

解决方案 4:

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

>>> var = 23
>>> f"{var:#010b}"
'0b00010111'

解释:

  • var要格式化的变量

  • :此后的所有内容都是格式说明符

  • #使用替代形式(添加0b前缀)

  • 0用零填充

  • 10填充至总长度 10 (这包括 的 2 个字符0b

  • b使用二进制表示数字

解决方案 5:

您可以使用字符串格式化迷你语言(感谢@Martijn Pieters 的建议)的想法:

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

演示:

print(binary(1))

输出:

'0b00000001'

解决方案 6:

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

>>> x = 5
>>> n = 8
>>> print(f"{x:0{n}b}")
00000101

这里我打印变量x的格式如下:我希望它左边填充的0是长度 = n,采用b(二进制)格式。有关更多信息,请参阅先前答案中的格式规范迷你语言。

解决方案 7:

有时你只想要一个简单的一行:

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

Python 3

解决方案 8:

虽然已经发布了许多解决方案,但最快的方法(如果您不需要前面的'0b'部分)是将f'{x:'b'}' 与 .zfill(n) 结合起来进行填充

即使您想要前导“0b”,您也可以使用以下代码添加它:

'0b'+f'{i:b}'.zfill(n)

而且它比使用该方法更快更易读f"{x:0{n}b}"

在此处查找相关的基准测试代码和结果

解决方案 9:

你可以使用类似这样的东西

("{:0%db}"%length).format(num)

解决方案 10:

您可以使用 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) 将返回 x 作为 '02' 表示二月。

解决方案 11:

您可以使用string.rjust方法:

string.rjust(length, fillchar)

fillchar是可选的

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

'0b'+ '1'.rjust(8,'0)

所以它将是 '0b00000001'

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4027  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2755  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   86  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   99  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   87  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用