二進位、八進位與十六進位(也稱為 hex)是不同的記數系統,各有不同的基數。 二進位的基數是 2,八進位是 8,十六進位是 16。 一般的整數在 Python 中基數是 10。 二進位、八進位與十六進位都只是整數的表示方式。 這表示它們能表示正數與負數(包括零),不含分數或小數,並且支援我們能對整數做的所有運算。
二進位是基數為 2 的記數系統,只使用數字 0 和 1。 它通常用來表示電腦中電流通過電晶體與開關的 0(「關」)與 1(「開」)狀態,也用來表示磁性儲存媒體中的正負電荷。 二進位可以表示基數 10 中使用的所有整數。
基數 2 系統的一小段看起來像這樣,雖然它會無限延伸,不會停在 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 中,我們可以使用0b前綴來表示二進位字面值。
如果我們寫下0b10011,Python 會將它解讀為二進位數字,並轉換成基數 10。
>>> 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
如果你是在本機環境作業,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。
我們可以在 Python 中使用0x前綴來表示十六進位數字。
和二進位、八進位一樣,Python 會自動將十六進位字面值轉換成int。
>>> 0x123
291
和二進位、八進位一樣,十六進位字面值就是整數,你可以對它們執行所有整數運算。
為非十六進位的數字加上0x前綴會引發SyntaxError。
若要將int轉換成十六進位表示,你可以使用內建的 [hex()][hex] 函式。
它的作用類似bin()函式,會回傳字串:
>>> hex(291)
'0x123'
若要將十六進位表示轉換成整數,我們可以使用int()函式,並將十六進位字串與基數(16)作為引數傳入:
>>> int("0x123", 16)
291
和二進位、八進位一樣,給錯基數會引發ValueError。