在Python中将整数转换为二进制

265

为将一个整数转换为二进制,我使用了以下代码:

>>> bin(6)  
'0b110'

当需要删除'0b'时,我使用以下方法:

>>> bin(6)[2:]  
'110'

如果我想将6显示为00000110而不是110,我该怎么做呢?


3
可能是Python int to binary? 的重复问题。 - Martin Thoma
17个回答

480
>>> '{0:08b}'.format(6)
'00000110'

以下是格式化字符串的各个组成部分的解释:

  • {} 将变量放入字符串中
  • 0 获取参数位置为0的变量
  • : 为该变量添加格式选项(否则它将表示十进制数6
  • 08 将数字格式化为在左侧填充八位零的形式
  • b 将数字转换为其二进制表示形式

如果您使用的是 Python 3.6 或更高版本,您还可以使用 f-字符串:

>>> f'{6:08b}'
'00000110'

13
第一个0代表format函数的第0个参数。冒号后面是格式化字符串,第二个0表示用0填充至8个空格,b表示二进制数。 - jamylak
1
@Aif:另外,请查看标准文档http://docs.python.org/library/string.html#format-specification-mini-language - pepr
28
可以使用format()函数简化此操作:format(6, '08b');该函数接受一个值(应用于{..}占位符)和一个格式规范(放在格式字符串中冒号后的内容)。 - Martijn Pieters
6
'{0:08b}'.format(-6) -> '-0000110'。如果您不想要符号,可以使用struct-6%256 - n611x007
1
@AK47 是的,自从Python 2.6版本以来,您可以使用0b或0B前缀以二进制形式编写int常量:_0b00000110_。 - Denis Barmenkov

127

只是另一个想法:

>>> bin(6)[2:].zfill(8)
'00000110'

通过字符串插值Python 3.6+)可实现更简短的方式:

>>> f'{6:08b}'
'00000110'

8
请注意,这个解决方案比被接受的解决方案更快。哪一个解决方案更清晰(或者,我敢说,更符合Python风格)可能是个人口味的问题。 - Air
我仍在学习Pythonicity的精髓,但这显然更加多才多艺。最初我对接受的解决方案及其优雅的解释感到兴奋,但警惕的是被调用执行方法的对象被写成一个包含所有规格的单个字符串,消除了变量在比特串所需长度等方面的参与。这完全解决了这个问题,并且(至少对于Python 2)非常直观,没有必要解释每个字符! - Post169
不适用于负整数 bin(-6)[2:].zfill(8) 读作 '0000b110' - jlandercy

26

一个位操作的方法...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
不错的方法。但我不明白你代码中这部分的作用: str((x >> i) & 1) - Gregory
2
@Gregory:它将 x 中的位向右移并与 1 进行 AND 操作,实际上每次提取一个位(0 或 1)。 - Jongware
非常好!作为一种观察,可以通过使用range(7,-1,-1)来删除reversed;虽然更加“纯粹”,但可能不太可读/直观。 - S3DEV
这是唯一支持负数的答案(由于Python将它们存储在二进制补码中,因此使用此方法输出的格式也是二进制补码格式)。 - Mew

25

只需使用 format 函数

format(6, "08b")

一般形式为

format(<the_integer>, "<0><width_of_string><format_specifier>")

2
是的,我喜欢这个,它简单而且速度非常快 :-) 1000000次循环,3次中最佳结果:每次循环556纳秒 - SebMa

11

eumiro的回答更好,不过我只是为了多样性而发布这个:

>>> "%08d" % int(bin(6)[2:])
00000110

11

numpy.binary_repr(num, width=None)有一个神奇的宽度参数

上述文档中的相关示例:

>>> np.binary_repr(3, width=4)
'0011'

The two’s complement is returned when the input number is negative and width is specified:

>>> np.binary_repr(-3, width=5)
'11101'

6
回归传统总是奏效的。
def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))

1
number=number/2 gives float, so number=number//2 seams better, also I would replace number=number//2 with number//=2 and b=b+"0" with b+="0" - Brambor
此外,您没有像 OP 要求的那样进行 0 填充。 - Brambor
如果 number=7,你的函数返回的是 "111" 而不是 "0111",这是意料之外的。 - Ye Xu
因为在7时,您仍然处于第三位。本质上,假设取决于要接收的大小,整个左侧都由零组成。 - Shadrack Kimutai

6

如果您不确定它是否始终应为8位数字,可以将其作为参数传递:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

4
最好的方法是指定格式。
format(a, 'b')

将a的二进制值以字符串格式返回。

要将二进制字符串转换回整数,请使用int()函数。

int('110', 2)

返回二进制字符串的整数值。


1
更好的方法是使用 format(a, '08b') 来获得用户想要的格式。 - ZSG

4
您可以只使用以下内容:
"{0:b}".format(n)

在我看来,这是最简单的方法!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接