如何在Python中将整数转换为二进制字符串?
37 → '100101'
如何在Python中将整数转换为二进制字符串?
37 → '100101'
str.format()
是过度的。直接使用format()
函数:format(n, 'b')
。无需解析占位符并将其与参数匹配,直接进行值格式化操作。仅当您需要将格式化后的结果放入较长的字符串中(例如将其用作模板)时,请使用 str.format()
。 - Martijn Pietersformat(10, '016b')
可以将数字10格式化为16位带前导零的二进制数。请注意,不要改变原文意思。 - Martijn Pieters"{0:b}"
中的 0
可以省略,对吧?我的意思是,在只格式化一个数字的情况下,把 "{:b}"
放进去是正确的,不是吗? - tomasyany"{:08b}".format(37)
。 - Sparkler0b10100101
。但在无符号整数中,该值将为165。因此,情况并不像这么简单。答案应反映出这一点。 - Dolf Andringastr(bin(i))[2:]
(1000000次操作只需0.369秒) 比使用 "{0:b}".format(i)
(1000000次操作需要0.721秒) 更快。 - mVChrstr.format()
不是正确的工具,你应该使用 format(i, 'b')
。注意,这也提供了填充和对齐选项。若要将其格式化为16位零填充二进制数,可以使用 format(i, '016b')
。如果要使用 bin()
实现相同的效果,则需要添加 str.zfill()
调用:bin(i)[2:].zfill(16)
(不需要调用 str()
!)。format()
的可读性和灵活性优于 bin()
,动态格式化与 bin()
相比更加困难。在不必要的情况下,不要以性能为最优,而要以易维护性为最优。 - Martijn Pietersf"{37:b}"
。 - Luke Davis实际上,Python内置了处理这种情况的功能,使用像'{0:b}'.format(42)
这样的操作可以给出一个字符串形式的位模式,并输出42
的二进制表示即101010
。
对于更一般的哲学问题,没有任何一种语言或库能够满足所有用户需要。如果你在一个不能提供完全符合需求的环境中工作,应该在开发过程中收集代码片段,以确保你不必重复编写同样的代码。例如,伪代码如下:
define intToBinString, receiving intVal:
if intVal is equal to zero:
return "0"
set strVal to ""
while intVal is greater than zero:
if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
这段伪代码将根据十进制值构建二进制字符串。请记住,这只是通用的伪代码,可能不是最有效的方法,但考虑到您所提议的迭代次数,这并不会有太大影响。它真的只是作为一个指南,展示如何完成。
总体思路是使用以下代码(按优先级排序):
s = "1" + s
和s = "0" + s
这两行代码。每一行都会无谓地复制s。相反,你应该在返回字符串之前将其反转。 - Andreas Magnusson'{0:b}'.format(42)
,慢速方法只是一个通用方法的示例,具体取决于实际使用的语言,可能是O(n^2),也可能不是。它看起来像Python,因为Python是一种理想的伪代码语言,所以我会更改它以使其清晰明了。 - paxdiablos
是字符串类型,那么s =“1”+ s
不是O(N)的语言可能会相当晦涩难懂。也许是一种所有字符串都是反向存储或每个字符都是链表中的节点的语言?对于任何典型的语言,字符串基本上是字符数组。在这种情况下,前缀字符串需要进行复制,否则你怎么能把字符放在其他字符之前呢? - Andreas Magnusson如果你想要一个没有0b前缀的文本表示,你可以使用这个:
get_bin = lambda x: format(x, 'b')
print(get_bin(3))
>>> '11'
print(get_bin(-3))
>>> '-11'
当你需要 n 位表示时:
get_bin = lambda x, n: format(x, 'b').zfill(n)
>>> get_bin(12, 32)
'00000000000000000000000000001100'
>>> get_bin(-12, 32)
'-00000000000000000000000000001100'
或者,如果您喜欢使用函数:
def get_bin(x, n=0):
"""
Get the binary representation of x.
Parameters
----------
x : int
n : int
Minimum number of digits. If x needs less digits in binary, the rest
is filled with zeros.
Returns
-------
str
"""
return format(x, 'b').zfill(n)
format(integer, 'b')
来实现。bin()
是一种调试工具,专门用于生成Python二进制整数字面量语法,format()
则用于生成特定格式的输出。 - Martijn Pietersbin()
是一个旨在生成Python二进制整数字面量语法的调试工具呢?我在文档中找不到相关信息。 - Martin Thomaoct()
和 hex()
同样适用。 - Martijn Pietersstr.format()
或者动态的第二个参数来使用 format()
,而不是 str.zfill()
:'{0:0{1}b}'.format(x, n)
或者 format(b, '0{}b'.format(n))
。 - Martijn Pieters我惊讶地发现,没有提到使用Python 3.6及更高版本中支持的格式化字符串来实现这一点的好方法。简而言之:
>>> number = 1
>>> f'0b{number:08b}'
'0b00000001'
这是Python 3.6及以上版本中提供的字符串格式化功能:
>>> x, y, z = 1, 2, 3
>>> f'{x} {y} {2*z}'
'1 2 6'
你也可以请求二进制文件:
>>> f'{z:b}'
'11'
指定宽度:
>>> f'{z:8b}'
' 11'
请求零填充:
f'{z:08b}'
'00000011'
并添加公共前缀以表示二进制数:
>>> f'0b{z:08b}'
'0b00000011'
你也可以让 Python 为您添加前缀,但我不太喜欢它,因为您必须考虑前缀的宽度:
>>> f'{z:#010b}'
'0b00000011'
f'0b{z:09_b}'
=> '0b0000_0011'
- Fredericf'{z:08b}'[::-1]
来实现最不重要字节优先排序,但在我看来,在大多数情况下,这只会导致混淆... - Roman Pavelkatimeit.timeit('f"{2:08b}"', number=10000000) => 1.1823169720000806
,而timeit.timeit('format(2,"08b")', number=10000000) => 1.3507722609992925
。 - Terrance作为参考:
def toBinary(n):
return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])
这个函数可以将一个正整数转换为字符串表示形式'1111111111111111111111111111111111111111111111111111111111111111'
,最大可以转换到18446744073709551615
。
虽然它可以被修改以服务更大的整数,但可能不像"{0:b}".format()
或bin()
那样方便。
一种简单的方法是使用字符串格式,可以查看这个页面。
>> "{0:b}".format(10)
'1010'
如果您希望二进制字符串具有固定的长度,可以使用以下代码:
>> "{0:{fill}8b}".format(10, fill='0')
'00001010'
如果需要使用二进制补码,可以使用以下代码:
'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)
n代表二进制字符串的宽度。
使用lambda的一行代码:
>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)
测试:
>>> binary(5)
'101'
编辑:
但是随后 :(
t1 = time()
for i in range(1000000):
binary(i)
t2 = time()
print(t2 - t1)
# 6.57236599922
相较于
t1 = time()
for i in range(1000000):
'{0:b}'.format(i)
t2 = time()
print(t2 - t1)
# 0.68017411232
'0'
替换 ''
,但这会在任何数字前面添加一个前导 0。 - Aziz Alto由于前面的答案大多使用了format()函数,这里提供一种f-string的实现方法。
integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')
输出:
00111
为了方便起见,这里是Python文档中格式化字符串字面值的链接:https://docs.python.org/3/reference/lexical_analysis.html#f-strings。