進数表記と進数変換

進数表記と進数変換

進数表記

 $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$ のように記述します。
 

8 進数の表記

 底に $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}\]
となります。
 

16 進数の表記

 $16$ 進数を表すには、ひとつ厄介な問題があります。たとえば $16^3$ の位が $12$ 個であるとき、この $12$ を表記するための適切な文字がないからです (人類は長い間 $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 をつけます。

# 先頭に0bのつく数値は2進数です
a = 0b1111
b = 0b10000
c = 0b1100100

num = [a, b, c]

print(num)
[15, 16, 100]

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

# 10進数の数値を2進数文字列に変換
a = bin(15)
b = bin(16)
c = bin(100)

num = [a, b, c]

print(num)
['0b1111', '0b10000', '0b1100100']

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

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

print(a)
15

 

8 進数表記

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

# 先頭に0oのつく数値は8進数です
a = 0o77
b = 0o100
c = 0o1750

num = [a, b, c]

print(num)
[63, 64, 1000]

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

# 10進数の数値を8進数文字列に変換
a = oct(63)
b = oct(64)
c = oct(1000)

num = [a, b, c]

print(num)
['0o77', '0o100', '0o1750']

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

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

print(a)
64

 

16 進数表記

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

# 先頭に0x のつく数値は16進数です
a = 0xFF
b = 0x100
c = 0x3E8

num = [a, b, c]

print(num)
[255, 256, 1000]

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

# 10進数の数値を16進数文字列に変換
a = hex(255)
b = hex(256)
c = hex(1000)

num = [a, b, c]

print(num)
['0xff', '0x100', '0x3e8']

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

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

print(a)
255