2進数,8進数,16進数の扱い
初回公開:2017/09/03
最終更新:未
【 目次 】
2進数,8進数,16進数表記の数値を記述する
先頭に0bや0O,oxを付ける事で2進数,8進数,16進数表記の数値を記述する事ができる。
- 2. 組み込み関数 — Python 3.6.1 ドキュメント
class int(x=0)(原文)
class int(x, base=10)
...
基数 2, 8, 16 のリテラルは、別の記法としてコード中の整数リテラルのように 0b/0B, 0o/0O, 0x/0X を前に付けることができます。 基数 0 はコードリテラルとして厳密に解釈することを意味します。
その結果、実際の基数は 2, 8, 10, 16 のどれかになります。 したがって int('010', 0) は有効ではありませんが、 int('010') や int('010', 8) は有効です。
print(0b1111,0O17,0xf)
2進数の1111,8進数の17,16進数のfはすべて10進数の15を示している。
実行結果
15 15 15
数値を2進数,8進数,16進数の表記の文字列に変換
逆に2進数や8進数,16進数を文字列としてあらわすにはbin関数,oct関数,hex関数を使う。
print(bin(15),oct(15),hex(15))
実行結果
0b1111 0o17 0xf
しかし、これらの関数は先頭に0bや0o,0xが付加されたり結果の桁数が不揃いになってしまうので、これを回避するにはformat関数 を使う等の工夫が必要。
- 2. 組み込み関数 — Python 3.6.1 ドキュメント
- 6.1. string — 一般的な文字列操作 — Python 3.6.1 ドキュメント
- Pythonの文字列フォーマット - Qiita
print("int: {0:4d}; hex: {0:04x}; oct: {0:06o}; bin: {0:017b}".format(15))
hexの{0:04x}の意味は、最初の0はformatの最初の引数15を示し、次の:の後の0はスペースを0で埋める事を示す。
そして4は4桁の文字列を,xは16審表記をする事を示している。
実行結果
int: 15; hex: 000f; oct: 000017; bin: 0000000000001111
他にもzfillメソッドを使った方法も
print(format(15,'b').zfill(16))
ついでに、zfillメソッドのお仲間のメソッドも
2進数,8進数,16進数の表記の文字列を数値に変換
int型にキャストして(intクラスのコンストラクタに基数を指定して)、以下のように記述する事もできる。
print(int('1111',2),int('0O17',8),int('f',16))
実行結果
15 15 15
文字列の先頭に2進数,8進数,16進数である事を示す0b,0o,0xも文字を付加する事も可能。
print(int('0b1111',2),int('0o0017',8),int('0xf',16))
しかし、16進数表記の文字列に2進数の基数を指定したり、つじつまの合わない文字列を指定した場合には当然エラーになる。
result=int('0x11',2) -> ValueError: invalid literal for int() with base 2: '0x11'
また、文字列の先頭に2進数,8進数,16進数である事を示す0b,0o,0xも文字を付加する事には、基数に0を指定する事で2進数,8進数,16進数表記のどの文字列でも数値に変換する事が可能なようだ。