2進数、8進数、16進数(hexとも呼ばれます)は、それぞれ基数の異なる記数法です。 2進数は基数2、8進数は基数8、16進数は基数16です。 Pythonでは、通常の整数は基数10です。 2進数、8進数、16進数はどれも整数の表現方法です。 つまり、小数や分数を使わずに正の数と負の数(ゼロを含む)を表し、整数でできるすべての演算をサポートするということです。
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では、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進数は整数なので、整数でできるすべての演算を実行できます。
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
2進数と整数の表現の間でも演算を行えます。
ただし、通常の数学の演算子のルールが適用されます。2つの2進数や整数を割り算すると、割り切れて小数部分が出なくても、結果はfloatになります。
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
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進数に対して使える特別なメソッドもいくつかあります。
<int>.bit_length()は、その数値を表すのに必要なビット数を返します。
>>> 0b11011.bit_length()
5
<int>.bit_count()は、2進数の中にある1の個数を返します。
たとえば、'0b11011'に対してbit_count()を呼び出すと4が返ります。
>>> 0b11011.bit_count()
4
ローカル環境で作業する場合、bit_count()には少なくともPython 3.10が必要です。
Exercismのオンラインエディターは現在、Python 3.11までのすべての機能に対応しています。
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が発生します。
intを8進数表現に変換するには、組み込みの[oct()][oct]関数を使えます。
これはbin()関数と同じように動作し、文字列を返します。
>>> oct(83)
'0o123'
8進数を整数に変換するには、int()関数を使い、8進数表現の文字列と基数(8)を引数として渡します。
>>> int("0o123", 8)
83
2進数のときと同じく、基数を間違えるとValueErrorが発生します。
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が発生します。
intを16進数表現に変換するには、組み込みの[hex()][hex]関数を使えます。
これはbin()関数と同じように動作し、文字列を返します。
>>> hex(291)
'0x123'
16進数表現を整数に変換するには、int()関数を使い、16進数の文字列と基数(16)を引数として渡します。
>>> int("0x123", 16)
291
2進数や8進数のときと同じく、基数を間違えるとValueErrorが発生します。