Python 整数と基数表現
株式会社リュディアです。Python における整数の基数についてまとめてみます。Python3 を前提としており動作は Anaconda3 で確認しています。Phthon の数値型についてまとめた以下の記事も参考にどうぞ。
プログラマの方にはお馴染みかもしれませんが簡単に基数について説明します。皆さんは2進数や16進数という言葉を聞いたことがあると思います。私たちが通常の生活で使っているのは 10進数です。2進数、10進数、16進数の2, 10, 16 を基数と呼びます。基数は桁が1つあがると何倍になっているかを示しています。
例えば10進数で考えてみましょう。10 から1つ桁があがった 100 は 10 の10倍ですね。これが基数の意味です。
では Python で基数を意識して整数を表現するにはどうしたらよいか見てみましょう。まず以下の例をみてください。
dec_a = 10
bin_a = 0b10
oct_a = 0o10
hex_a = 0x10
print(dec_a, bin_a, oct_a, hex_a)
>> 10 2 8 16
10進数は decimal(デシマル)、2進数は binary(バイナリ)、8進数は octal(オクタル) 、16進数は hexadecimal(ヘキサデシマル)と英語で表現します。この例ではそれぞれ10進数、2進数、8進数、16進数の 10 (十ではなくてイチゼロと読んでください)を変数の初期値としています。print 文で表示するとすべて 10 進数として表示されます。
順に見ていきましょう。最初の dec_a = 10 は10進数の 10 なのでいわゆる日常的に使う十です。問題ないですね。次は bin_a = 0b10 です。0b の後に続く数字は2進数です。2進数の 10 は十進数では 2 です。print 文の出力は10進数なので 2 になってますね。同様に 0o を指定すると8進数、0x を指定すると 16 進数となります。
今度はprint 文と一緒に fomrat 文を使って基数を反映した表示を行ってみましょう。以下の例をみてください。
dec_a = 10
bin_a = 0b10
oct_a = 0o10
hex_a = 0x10
print('{:d} {:b} {:o} {:x}'.format(dec_a, bin_a, oct_a, hex_a))
>> 10 10 10 10
いずれも表記が 10 となっていますが、それぞれ10進数、2進数、8進数、16進数なので注意が必要です。
最後に整数を扱う際のアンダースコア "_" の利用についてまとめておきます。特に2進数や16進数ではアンダースコアを上手く利用することでプログラムの可読性があがります。10進数でアンダースコアを利用する例も入っています。以下の例を見てください。
dec_1k = 1_000
dec_1m = 1_000_000
bin_ff = 0b_1111_1111
bin_01 = 0b_0000_0001
hex_ff = 0x_ff
hex_01 = 0x_01
print(dec_1k, dec_1m)
print('{:d} {:d} {:b} {:b}'.format(bin_ff, bin_01, bin_ff, bin_01))
print('{:d} {:d} {:x} {:x}'.format(hex_ff, hex_01, hex_ff, hex_01))
>> 1000 1000000
>> 255 1 11111111 1
>> 255 1 ff 1
最初の2つはアンダースコアを使って 10進数を指定しました。3桁ごとにカンマを入れると見やすくなる場合がありますが、カンマの代わりにアンダースコアを利用しています。
次の例は2進数です。4桁ごとに区切りを入れると見やすくなることが多いです。2進数の4桁が16進数の1桁に相当するためです。
最後の例は16進数です。2桁ごとに区切りを入れると見やすくなることが多いです。いわゆるバイト = 8ビットであり、16進数の2桁が 1バイトに相当するためです。
今回は整数の基数表現についてまとめてみました。プログラムの実行結果には影響しませんが意識して利用すると可読性が向上します。ぜひ積極的につかってみてください。
では、ごきげんよう。