学习路径
/
Python
Python
/
教学大纲
/
二进制、八进制和十六进制
二进

二进制、八进制和十六进制 属于 Python

{other: "%{count} 个练习"}

关于 二进制、八进制和十六进制

二进制、八进制和十六进制(又称 hex)是记数系统的不同形式,各有不同的基数。 二进制的基数是 2,八进制是 8,十六进制是 16。 普通整数在 Python 中是十进制。 二进制、八进制和十六进制都是整数的表示方式。 这意味着它们表示正数和负数(包括零)时不含分数或小数,并支持我们能用整数进行的所有运算。

二进制

二进制是一种基数为 2 的记数系统,只使用数字 0 和 1。 它通常表示计算机中电流通过晶体管和开关时的 0(“关”)和 1(“开”)两种状态,也表示磁性存储介质中的正负电荷。 二进制可以表示十进制中使用的所有整数。

二进制系统的一小部分如下所示,尽管它可以无限延伸,并不会在 128 处停止:

128 64 32 16 8 4 2 1
2 ** 7 2 ** 6 2 ** 5 2 ** 4 2 ** 3 2 ** 2 2 ** 1 2 ** 0

所以如果我们想用二进制表示数字 6,那就是 110。

位值 4 2 1
二进制数 1 1 0

运算过程是:4 + 2 + 0 = 6

再看一个例子:19

位值 16 8 4 2 1
二进制数 1 0 0 1 1

这个二进制数是:10011 运算过程是:16 + 0 + 0 + 2 + 1 = 19

Python 中的二进制

在 Python 中,我们可以用0b前缀来表示二进制字面量。 如果我们写0b10011,Python 会把它解释为二进制数,并转换成十进制。

>>> 0b10011
19

>>> type(0b10011)
<class 'int'>

Python 中的二进制只是书写整数的一种不同方式,因此对于所有数学运算来说,二进制表示就是整数。

如果你写的带0b前缀的数字不符合二进制系统,就会引发SyntaxError。

Traceback (most recent call last):
  File "c:\binary.py", line 1, in <module>
    0b10211
SyntaxError: invalid digit '2' in binary literal

二进制数的运算

既然二进制数就是整数,我们就能对它们执行所有能用整数进行的运算。

# addition
>>> 0b10011 + 0b10011
38

# multiplication
>>> 0b10011 * 0b10011
361

我们也可以在二进制表示和整数表示之间进行运算。 不过,通常的数学运算符规则仍然适用:两个二进制数或整数相除会返回float,即使除法结果没有小数部分。

>>> 0b10011 + 19
38

>>> 0b10011/0b10011
1.0

>>> 0b10011/3
6.333333333333333

二进制表示的转换

Python 会自动把二进制字面量转换成int。 要把int转换成二进制表示,可以使用内置的[bin()][bin]函数。 bin()会返回一个str,内容是带0b前缀的等值二进制形式。

>>> bin(19)
'0b10011'

要把二进制字面量转换成整数,我们可以使用内置的int()函数,传入二进制表示的字符串和基数参数:

>>> int("0b10011", 2)
19

如果传入错误的基数(或无效的二进制表示),就会引发ValueError:

Traceback (most recent call last):
  File "c:\binary.py", line 4, in <module>
    int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'

二进制方法

还有一些特殊方法可以用在二进制数上。

<int>.bit_length()会返回表示该数字所需的位数:

>>> 0b11011.bit_length()
5

<int>.bit_count()会返回二进制数中1的个数。 例如,对 '0b11011' 调用bit_count()会返回 4:

>>> 0b11011.bit_count()
4
Note

如果你是在本地运行,bit_count()需要至少 Python 3.10。 Exercism 在线编辑器目前支持到 Python 3.11 为止的全部功能。

八进制

八进制是一种基数为 8 的记数系统。 它使用数字 0、1、2、3、4、5、6 和 7。

在 Python 中,我们可以用0o前缀来表示八进制数。 与二进制一样,Python 会自动把八进制表示转换成int。

>>> 0o123
83

与二进制一样,八进制数就是整数,支持所有整数运算。 给不符合八进制系统的数字加上0o前缀,会引发SyntaxError。

八进制表示的转换

要把int转换成八进制表示,可以使用内置的[oct()][oct]函数。 它的作用与bin()函数类似,会返回一个字符串:

>>> oct(83)
'0o123'

要把八进制数转换成整数,我们可以使用int()函数,传入八进制的字符串表示和基数(8)作为参数:

>>> int("0o123", 8)
83

与二进制一样,传入错误的基数会引发ValueError。

十六进制

十六进制是一种基数为 16 的记数系统。 它使用数字 0 - 9 以及字母 A、B、C、D、E 和 F。 A 是 10,B 是 11,C 是 12,D 是 13,E 是 14,F 是 15。

我们可以用0x前缀在 Python 中表示十六进制数。 与二进制和八进制一样,Python 会自动把十六进制字面量转换成int。

>>> 0x123
291

与二进制和八进制一样,十六进制字面量就是整数,你可以对它们执行所有整数运算。 给非十六进制数字加上0x前缀会引发SyntaxError。

十六进制表示的转换

要把int转换成十六进制表示,可以使用内置的[hex()][hex]函数。 它的作用与bin()函数类似,会返回一个字符串:

>>> hex(291)
'0x123'

要把十六进制表示转换成整数,我们可以使用int()函数,传入十六进制字符串和基数(16)作为参数:

>>> int("0x123", 16)
291

与二进制和八进制一样,传入错误的基数会引发ValueError。

通过 GitHub 编辑 该链接会在新窗口或标签页中打开