進数表記と進数変換

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

進数表記

$m = 0,\;1,\;2,\;…$ として $x^m$ の束で数字を表すことを $x$ 進数表記とよびます。
私たちが普段用いている表記は10進数なので、$10^m$ の束(たば)によって数字を表しています。たとえば $5719$ という数字は
 \[5719=5\times 10^3+7\times 10^2+1\times 10^1+9\times 10^0\]
という意味をもちます。$10^m$ の束のことを「位」とよびます。$10^3$ の束は千の位、$10^2$ の束は百の位です。

$x$ のことを といいます。底として $10$ 以外の数字を選択することもあります。$x=2$ とすれば、2進数 (binary) です。たとえば、2進数で表された $101101$ の各位は下の表のようになります。
 
2進数表記binaryの位
表にしたがって、$101101$ を10進数に変換すると、
 \[1\times 2^5+0\times 2^4+1\times 2^3+1\times 2^2+0\times 2^1+1\times 2^0 = 45\]
となります。しかし、単に数字を $101101$ のように書いたのでは、底がいくつなのか判明しません(十万一千百一だと勘違いされるおそれがあります)。そこで、ある数字が $x$ 進数であることを明記するために、数字全体を ( ) で囲って底を右下に添えることがあります。上の例では $(101101)_2$ のように記述します。

底に $x=8$ を選べば8進数です。8進数は $8^m$ の束で数字を表します。
たとえば、$(527)_8$ と表された数字を10進数に変換すると
 \[(527)_8=5\times 8^2+2\times 8^1+7\times 8^0=(343)_{10}\]
となります。

底に $x=16$ を選べば16進数ですが、ひとつ厄介な問題があります。$10$ ~ $15$ を表記するための適切な文字がないからです (人類は長い間10進数を使ってきたので、$0$ ~ $9$ の $10$ 種類の数字しか用意されていません)。そこで仕方なく、16進数で表された数字の位が $10$ ~ $15$ である場合、アルファベットの $A$ ~ $F$ で代用することになっています。10進数との対応表は次のようになります。
 
16進数と10進数の対応表
対応表を使って、$(\mathrm{D}5\mathrm{F}3)_8$ を10進数に変換してみます。
 
16進数hexadecimalの位
 \[(\mathrm{D}5\mathrm{F}3)_{16}=13\times 16^3+5\times 16^2+15\times 16^1+3\times 16^0=(54771)_{10}\]

Pythonにおける進数表記と相互変換

Python で 2進数8進数16進数 をリテラルで表記する場合、数値の先頭に 0b, 0o, 0x をつける というルールがあります。また、10進数リテラル数値をそれぞれの進数表記の文字列に変換するための関数も用意されています。

2進数表記

2進数表記の数値をリテラルで入力するときは数値の頭に 0b をつけます。

# PYTHON_BINARY

# In[1]

# 先頭に0bのつく数値は2進数
val = 0b1111

print(val)
# 15

bin 関数を使うと、10進数表記の数値を2進数表記の文字列に変換することができます。ちなみに、”bin” は “binary digits” の略です。

# In[2]

# 10進数の数値を2進数文字列に変換

val= bin(15)

print(val)
# '0b1111'

2進数表記の文字列を10進数表記の数値に変換するときには int 関数を用います(第2引数には底の2を指定します)。

# In[3]

# 2進数文字列を数値に変換
val = int("0b1111", 2)

print(val)
# 15

8進数表記

8進数表記の数値をリテラルで入力するときは数値の頭に 0o をつけます。

# PYTHON_OCTAL

# In[1]

# 先頭に0oのつく数値は8進数です
val = 0o77

print(val)
# 63

oct 関数を使うと、$10$ 進数表記の数値を8進数表記の文字列に変換できます。
oct は octal digits ($8$ 進数) の略です。

# In[2]

# 10進数の数値を8進数文字列に変換
val = oct(63)

print(val)
# '0o77'

8進数表記の文字列を10進数表記の数値に変換するときには int 関数を用います(第2引数に底の8を指定します)。

# In[3]

# 8進数文字列を数値に変換
val = int("0o77", 8)

print(val)
# 63

16進数表記

16進数表記の数値をリテラルで入力するときには数値の頭に 0x をつけます。

# PYTHON_HEXADECIMAL

# In[1]

# 先頭に0xのつく数値は16進数
val = 0x3E8

print(val)
# 1000

hex 関数を用いると、10進数表記の数値を16進数表記の文字列に変換できます。
hex は hexadecimal digits (16進数) の略です。

# In[2]

# 10進数の数値を16進数文字列に変換
val = hex(1000)

print(val)
# '0x3e8'

16進数表記の文字列を10進数表記の数値に変換するときには int 関数を用います(第2引数に底の16を指定します)。

# In[3]

# 16進数文字列を数値に変換
val = int("0x3e8", 16)

print(val)
# 1000

➡︎【おすすめ記事】Pythonで順列の総数を計算する

コメント

  1. 成宮 より:

    (2進数で表すのが小数の場合)0.25を2進数0.01と表現する時、0b.01と書きますか?それとも0b0.01とかなんでしょうか。
    ご教授お願いしますm(_ _)m

    • あとりえこばと より:

      コメントありがとうございます。Python で 0b や 0o などのプレフィックスのついた表記を数値リテラルとして認識するのは整数 (int型) だけです。小数 (float型) についてはサポートしていません。

  2. あとりえこばと より:

    【AI連載小説】科学とコードの交差点(13)
     
    深夜のラボで、六郷開誠と刑部明信は16進数の取り扱いにおける深層の議論に没頭していた。開誠はノートにメモを取りながら言った。「16進数はデータ表現において重要だけど、特にビッグエンディアンとリトルエンディアンの扱い方も重要だよね」
     
    明信は頷きながら返答する。「そうだね。特にデータ通信やファイルフォーマットなど、データのエンディアンが異なる場合には、注意が必要だ。Pythonではstructモジュールを使ってエンディアンを指定できるのも便利だよ。」

    開誠が深呼吸しながら続ける。「また、16進数は色の表現にもよく使われる。RGBやARGBのような色情報は16進数で表現されることが多い」
     
    明信は微笑みながら応じる。「そうだね。色の表現においては、16進数を使うことで直感的にわかりやすく、かつ簡潔に記述できる。」
     
    開誠は新たなトピックに移りながら言った。「それに、16進数はアセンブリ言語や低レベルのプログラミングで頻繁に登場する。こうした領域では、ビット単位での操作が求められることが多いからな」