軌道
/
Python
Python
/
課程大綱
/
二進位、八進位與十六進位
二進

二進位、八進位與十六進位 在 Python

{other: "%{count} 個練習"}

關於 二進位、八進位與十六進位

二進位、八進位與十六進位(也稱為 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 中的二進位

在 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
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。

我們可以在 Python 中使用0x前綴來表示十六進位數字。 和二進位、八進位一樣,Python 會自動將十六進位字面值轉換成int。

>>> 0x123
291

和二進位、八進位一樣,十六進位字面值就是整數,你可以對它們執行所有整數運算。 為非十六進位的數字加上0x前綴會引發SyntaxError。

十六進位表示法的轉換

若要將int轉換成十六進位表示,你可以使用內建的 [hex()][hex] 函式。 它的作用類似bin()函式,會回傳字串:

>>> hex(291)
'0x123'

若要將十六進位表示轉換成整數,我們可以使用int()函式,並將十六進位字串與基數(16)作為引數傳入:

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

和二進位、八進位一樣,給錯基數會引發ValueError。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟