Python中如何表示二进制字面量?

400

如何用Python字面量将整数表示为二进制数字?

对于十六进制,我很容易找到答案:

>>> 0x12AF
4783
>>> 0x100
256

以及八进制:

>>> 01267
695
>>> 0100
64
如何在Python中使用字面量表示二进制?
答案摘要:
  • Python 2.5及更早版本:可以使用int('01010101111',2)来表示二进制,但不能使用字面量。
  • Python 2.5及更早版本:没有办法表示二进制字面量。
  • Python 2.6 beta:可以这样做:0b11001110B1100111
  • Python 2.6 beta:还允许使用0o270O27(第二个字符是字母O)来表示八进制。
  • Python 3.0 beta:与2.6相同,但不再允许旧的027语法表示八进制。
8个回答

353

供参考——未来 Python 可能性:
从 Python 2.6 开始,可以使用前缀0b0B表示二进制字面量:

>>> 0b101111
47

你也可以使用新的bin函数来获取一个数字的二进制表示:

>>> bin(173)
'0b10101101'

Python 2.6的新特性文档的开发版本:

What's New in Python 2.6

84
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

另一种方式。


2
当你处理字符串时,这很有趣,但如果处理纯数字,它会给代码添加不必要的计算。 - Daniel Möller

41

如何在Python中表示二进制字面量?

它们不是"二进制"字面量,而是"整数"字面量。您可以使用二进制格式通过以0开头,后跟Bb,然后跟一系列的零和一来表示整数字面量,例如:

>>> 0b0010101010
170
>>> 0B010101
21

从 Python 3 的文档中可知,以下是在 Python 中提供整数字面量的方式:

整数字面量由以下词汇定义描述:

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
bininteger   ::=  "0" ("b" | "B") (["_"] bindigit)+
octinteger   ::=  "0" ("o" | "O") (["_"] octdigit)+
hexinteger   ::=  "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit ::=  "1"..."9"
digit        ::=  "0"..."9"
bindigit     ::=  "0" | "1"
octdigit     ::=  "0"..."7"
hexdigit     ::=  digit | "a"..."f" | "A"..."F"

整数字面量的长度没有限制,除了可用内存可以存储的长度。

请注意,在非零十进制数字中不允许前导零。这是为了消除在Python 3.0版本之前使用的C样式八进制字面量的歧义。

一些整数字面量的示例:

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

从版本3.6开始更改:现在,下划线可以用于字面量的分组。

表达二进制的其他方式:

你可以使用字符串对象来表示0和1,并对其进行操作(虽然在大多数情况下,你应该只对整数进行按位操作)-只需将0和1的字符串和要转换的基数(2)传递给int函数即可:

>>> int('010101', 2)
21

您可以选择使用前缀0b0B

>>> int('0b0010101010', 2)
170

如果你将基数设置为0,它会假设字符串没有前缀并使用十进制:

>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21

将整数转换回人类可读的二进制:

您可以将整数传递给bin,以查看二进制字面值的字符串表示形式:


>>> bin(21)
'0b10101'

你可以组合binint来进行来回转换:

>>> bin(int('010101', 2))
'0b10101'

如果你想在前面填充零并达到最小宽度,你也可以使用格式规范:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'

int(hex(1234), 16) = 1234 的意思是将十进制数 1234 转换为十六进制,然后再将其转换回十进制,结果仍为 1234。 - Jean Monet

3

这里的起始数字0指定了进制为8(而不是10),这很容易看出:

>>> int('010101', 0)
4161

如果数字不以0开头,Python就会默认这个数字是十进制。
>>> int('10101', 0)
10101

3

我已经在Python 3.6.9中尝试过这个方法

将二进制转换为十进制

>>> 0b101111
47

>>> int('101111',2)
47

将十进制转换为二进制

>>> bin(47)
'0b101111'

将第二个参数设置为0,Python会将其视为十进制。

>>> int('101111',0)
101111

1
另一个从二进制获取整数表示的好方法是使用eval()。
像这样:
```python eval('0b1010') ```
注意:保留HTML标签。
def getInt(binNum = 0):
    return eval(eval('0b' + str(n)))

我猜这也是一种方法。 希望这是一个令人满意的答案:D


不,这绝对不是一个好方法。你永远不应该使用 eval() - Paul Evans

-2
据我所知,Python在2.5版本之前只支持十六进制和八进制字面量。我找到了一些关于在未来版本中添加二进制的讨论,但没有确定的结论。

-3

我非常确定这是Python 3.0中要更改的事情之一,也许会与hex()和oct()一起使用bin()。

编辑: lbrandy的答案在所有情况下都是正确的。


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