【Python】進数変換まとめ【2進数、10進数、16進数、float】

python

こんにちは、コウキです。

普段の生活では、2進数や16進数は目にしないかもしれませんが、分野によってはよく使っている人もいるのではないでしょうか。

今回はPythonで数値↔文字列の進数変換を行う方法を紹介します。そのままでも使えるように関数になっています。文字列の場合は文字数が決まっていたほうが都合が良いことが多いので、指定できるようになっています。おまけでfloat型の変換も載せています。

進数の知識があれば何をやっているか理解できると思いますが、そこまで詳しくない人は気にせずそのまま使ってください。

自己流な部分もあるのでもっと良い方法があるかもしれません。

C++バージョンも執筆しました 。
【C++】進数変換まとめ【2進数、10進数、16進数、float】

必要なパッケージのimport

事前に必要なパッケージをimportしておきます。
一部の関数でしか使用しないので、必要なさそうであれば飛ばしてください。

import math
import struct

10進数 ↔ 2進数

10進数から2進数への変換

10進数から2進数の変換です。
プラスとマイナスで処理の仕方を変えています。

def itob(value: int, size) -> str:
    if value >= 0:
        result = format(value, "0{0}b".format(size))
    else:
        result = format(int("1" * size, 2) + value + 1, "b")
        result = '1' * size + result
    return result[-size:]

2進数から符号なし10進数への変換

続いて2進数から10進数の変換です。
符号なしの場合は簡単ですね。pythonの標準関数にそのまま入れるだけです。

def btoui(binary: str) -> int:
    return int(binary, 2)

2進数から符号あり10進数への変換

符号ありの場合は少し複雑になりますが、進数の知識があれば理解できると思います。
先頭のビットが1のときにマイナスの値であると判断します。

先頭のビットのみマイナスの値として足すことで、マイナスの値に変換することができます。
このやり方は意外と知らない方が多いのではないのでしょうか。
2の補数を求める必要はありません。

def btoi(binary: str) -> int:
    return int(binary[1:], 2) - int(int(binary[0]) << (len(binary) - 1))

10進数 ↔ 16進数

10進数から16進数への変換

10進数から16進数への変換です。
2進数のときと似ていますね。

def itoh(value: int, size) -> str:
    if value >= 0:
        result = format(value, "0{0}X".format(size))
    else:
        result = format(int("F" * size, 16) + value + 1, "X")
        result = 'F' * size + result
    return result[-size:]

16進数から符号なし10進数への変換

符号なしの場合は、2進数のときと同じでpythonの標準関数を使えば簡単に変換できます。

def htoui(hexa: str) -> int:
    return int(hexa, 16)

16進数から符号あり10進数への変換

符号ありの場合はマイナスの場合だけ処理が変わります。
でもやってることは2進数のときと同じです。

def htoi(hexa: str) -> int:
    if int(hexa[0], 16) < 8:  # plus
        result = int(hexa, 16)
    else:  # minus
        result = int(hexa, 16) - pow(16, len(hexa))
    return result

2進数 ↔ 16進数

2進数から16進数への変換

16進数に直したときの文字サイズを求めてから変換しています。

def btoh(binary: str) -> str:
    size = math.ceil(len(binary) / 4)
    return format(int(binary, 2), "0{0}X".format(size))

16進数から2進数への変換

さっきと逆なだけなので特に問題ないと思います。

def htob(hexa: str) -> str:
    size = len(hexa) * 4
    return format(int(hexa, 16), '0{0}b'.format(size))

float ↔ 16進数

floatから16進数への変換

pythonではstructというパッケージを使えば変換できるみたいですね。
float型の実数をpackして、整数としてunpackし、作成したitohの関数で16進数に変換しています。

def ftoh(pfloat) -> str:
    return itoh(struct.unpack(">L", struct.pack(">f", pfloat))[0], 8)

16進数からfloatへの変換

16進数からfloatへの変換です。
さっきと逆のことをします。

def htof(hexa) -> float:
    return struct.unpack(">f", struct.pack(">L", htoui(hexa)))[0]

最後に

今回はpythonでいろいろな進数変換をまとめてみました。
特定の分野では結構役に立つと思うので、ぜひ活用してみてください^^

コメント

タイトルとURLをコピーしました