UP
コレクション型のリテラル表記
前のページへ
Python
次のページへ
open関数とファイルオブジェクトとその他もろもろ


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関数 を使う等の工夫が必要。

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進数表記のどの文字列でも数値に変換する事が可能なようだ。

ページのトップへ戻る