如何在Python中表示二进制字面量?
如何用Python的字面量表示一个整数为二进制数?
我很容易找到了十六进制的表示方法:
>>> 0x12AF
4783
>>> 0x100
256
还有八进制的表示方法:
>>> 01267
695
>>> 0100
64
那么,如何用字面量在Python中表示二进制呢?
答案总结
- 在Python 2.5及之前的版本中:可以用
int('01010101111',2)
来表示二进制,但不能用字面量。 - 在Python 2.5及之前的版本中:没有办法用字面量表示二进制。
- 在Python 2.6的测试版中:可以这样表示:
0b1100111
或者0B1100111
。 - 在Python 2.6的测试版中:也可以用
0o27
或者0O27
(第二个字符是字母O)来表示八进制。 - 在Python 3.0的测试版中:和2.6一样,但不再允许使用旧的
027
语法来表示八进制。
8 个回答
41
如何在Python中表示二进制字面量?
其实它们并不是“二进制”字面量,而是“整数”字面量。你可以用二进制格式来表示整数字面量,方法是在前面加一个0
,然后跟上一个B
或b
,后面再接一串零和一,比如:
>>> 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"
除了可用内存的限制,整数字面量的长度没有限制。
需要注意的是,非零的十进制数字前面不能有零。这是为了避免和C语言风格的八进制字面量混淆,Python在3.0之前是使用这种方式的。
一些整数字面量的例子:
7 2147483647 0o177 0b100110111 3 79228162514264337593543950336 0o377 0xdeadbeef 100_000_000_000 0b_1110_0101
在3.6版本中更改:现在允许在字面量中使用下划线来分组。
其他表示二进制的方法:
你可以把零和一放在一个字符串对象里,这样可以进行操作(不过在大多数情况下,你可能只需要对整数进行位运算)——只需将零和一的字符串传给int,并指定你要转换的进制(2):
>>> int('010101', 2)
21
你可以选择性地在前面加0b
或0B
作为前缀:
>>> int('0b0010101010', 2)
170
如果你把0
作为进制传入,它会假设是十进制,前提是字符串没有指定前缀:
>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21
从整数转换回人类可读的二进制:
你可以把一个整数传给bin,来查看它的二进制字面量的字符串表示:
>>> bin(21)
'0b10101'
你也可以结合使用bin
和int
,在两者之间转换:
>>> bin(int('010101', 2))
'0b10101'
如果你想要最小宽度并且前面有零,可以使用格式规范:
>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
85
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255
还有一种方法。
358
供参考——未来 Python 的一些可能性:
从 Python 2.6 开始,你可以用前缀 0b 或 0B 来表示二进制数字:
>>> 0b101111
47
你还可以使用新的 bin 函数来获取一个数字的二进制表示:
>>> bin(173)
'0b10101101'
文档的开发版本:Python 2.6 新特性