トラック
/
Python
Python
/
シラバス
/
2進数、8進数、16進数
2進

2進数、8進数、16進数 の Python

{other: "%{count}個の演習"}

2進数、8進数、16進数について

2進数、8進数、16進数(hexとも呼ばれます)は、それぞれ基数の異なる記数法です。 2進数は基数2、8進数は基数8、16進数は基数16です。 Pythonでは、通常の整数は基数10です。 2進数、8進数、16進数はどれも整数の表現方法です。 つまり、小数や分数を使わずに正の数と負の数(ゼロを含む)を表し、整数でできるすべての演算をサポートするということです。

2進数

2進数は基数2の記数法で、0と1の数字だけを使います。 コンピューターのトランジスタやスイッチを流れる電気の0(「オフ」)と1(「オン」)の状態や、磁気記憶媒体の正負の電荷を表すためによく使われます。 2進数は、基数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を2進数で表すと、110になります。

位の値 4 2 1
2進数 1 1 0

計算は次のようになります:4 + 2 + 0 = 6

もう1つの例:19

位の値 16 8 4 2 1
2進数 1 0 0 1 1

2進数では10011になります。 計算は次のようになります:16 + 0 + 0 + 2 + 1 = 19

Pythonでの2進数

Pythonでは、0bプレフィックスを使って2進数のリテラルを表せます。 0b10011と書くと、Pythonはそれを2進数として解釈し、基数10に変換します。

>>> 0b10011
19

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

Pythonの2進数は、整数を別の書き方で表したものにすぎません。そのため、2進数表現は整数そのものであり、すべての数学演算に使えます。

0bプレフィックスを付けた数値が2進数として正しくない場合、SyntaxErrorが発生します。

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

2進数を使った演算

2進数は整数なので、整数でできるすべての演算を実行できます。

# addition
>>> 0b10011 + 0b10011
38

# multiplication
>>> 0b10011 * 0b10011
361

2進数と整数の表現の間でも演算を行えます。 ただし、通常の数学の演算子のルールが適用されます。2つの2進数や整数を割り算すると、割り切れて小数部分が出なくても、結果はfloatになります。

>>> 0b10011 + 19
38

>>> 0b10011/0b10011
1.0

>>> 0b10011/3
6.333333333333333

2進数表現の相互変換

Pythonは2進数のリテラルを自動的にintに変換します。 intを2進数表現に変換するには、組み込みの[bin()][bin]関数を使います。 bin()は、0bプレフィックスが付いた2進数の等価な値をstrとして返します。

>>> bin(19)
'0b10011'

2進数のリテラルを整数に変換するには、組み込みのint()関数を使い、2進数表現の文字列と基数の引数を渡します。

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

基数を間違えると(または2進数表現として無効な場合)、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'

2進数のメソッド

2進数に対して使える特別なメソッドもいくつかあります。

<int>.bit_length()は、その数値を表すのに必要なビット数を返します。

>>> 0b11011.bit_length()
5

<int>.bit_count()は、2進数の中にある1の個数を返します。 たとえば、'0b11011'に対してbit_count()を呼び出すと4が返ります。

>>> 0b11011.bit_count()
4
Note

ローカル環境で作業する場合、bit_count()には少なくともPython 3.10が必要です。 Exercismのオンラインエディターは現在、Python 3.11までのすべての機能に対応しています。

8進数

8進数は基数8の記数法です。 0、1、2、3、4、5、6、7の数字を使います。

Pythonでは、0oプレフィックスを使って8進数を表せます。 2進数のときと同じく、Pythonは8進数の表現を自動的にintに変換します。

>>> 0o123
83

2進数のときと同じく、8進数はintです。すべての整数演算をサポートします。 0oプレフィックスを付けた数値が8進数として正しくない場合、SyntaxErrorが発生します。

8進数表現の相互変換

intを8進数表現に変換するには、組み込みの[oct()][oct]関数を使えます。 これはbin()関数と同じように動作し、文字列を返します。

>>> oct(83)
'0o123'

8進数を整数に変換するには、int()関数を使い、8進数表現の文字列と基数(8)を引数として渡します。

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

2進数のときと同じく、基数を間違えるとValueErrorが発生します。

16進数

16進数は基数16の記数法です。 0から9までの数字と、A、B、C、D、E、Fの文字を使います。 Aは10、Bは11、Cは12、Dは13、Eは14、Fは15です。

Pythonでは、0xプレフィックスを使って16進数を表せます。 2進数や8進数のときと同じく、Pythonは16進数のリテラルを自動的にintに変換します。

>>> 0x123
291

2進数や8進数のときと同じく、16進数のリテラルはintです。すべての整数演算を実行できます。 16進数でない数値に0xを付け加えると、SyntaxErrorが発生します。

16進数表現の相互変換

intを16進数表現に変換するには、組み込みの[hex()][hex]関数を使えます。 これはbin()関数と同じように動作し、文字列を返します。

>>> hex(291)
'0x123'

16進数表現を整数に変換するには、int()関数を使い、16進数の文字列と基数(16)を引数として渡します。

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

2進数や8進数のときと同じく、基数を間違えるとValueErrorが発生します。

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます