[Python] 16進数の使い方

Pythonでは、16進数を簡単に扱うことができます。整数を16進数に変換するには、hex()関数を使用します。

例えば、hex(255)'0xff'を返します。16進数を整数に変換するには、int()関数を使用し、基数を指定します。

例として、int('ff', 16)255を返します。文字列フォーマットを使用して16進数を表示することも可能です。

フォーマット文字列'{:x}'を使うと、整数を16進数で表現できます。

この記事でわかること
  • 16進数リテラルの書き方と変換方法
  • 16進数の加算、減算、乗算、除算の演算方法
  • ビット操作(AND、OR、XOR、NOT、シフト演算)の実施方法
  • 16進数のフォーマット方法format関数、f-string、formatメソッド
  • カラーコードやメモリダンプ、バイナリデータの操作における応用例

目次から探す

Pythonでの16進数の表現

Pythonでは、16進数を扱うための便利な機能が用意されています。

ここでは、16進数リテラルの書き方や、文字列との相互変換について解説します。

16進数リテラルの書き方

16進数リテラルは、0xまたは0Xで始まる数値として表現されます。

以下のように記述します。

  • 0x1A(26の10進数表現)
  • 0xFF(255の10進数表現)
hex_value1 = 0x1A
hex_value2 = 0xFF
print(hex_value1)  # 26
print(hex_value2)  # 255
26
255

このコードでは、16進数リテラルを変数に代入し、10進数として出力しています。

文字列から16進数への変換

文字列を16進数に変換するには、int()関数を使用します。

文字列を引数に渡し、基数を16に指定します。

hex_string = "1A"
hex_value = int(hex_string, 16)
print(hex_value)  # 26
26

このコードでは、文字列"1A"を16進数として解釈し、10進数の26に変換しています。

16進数から文字列への変換

16進数を文字列に変換するには、hex()関数を使用します。

この関数は、整数を16進数の文字列に変換します。

decimal_value = 26
hex_string = hex(decimal_value)
print(hex_string)  # 0x1a
0x1a

このコードでは、10進数の26を16進数の文字列"0x1a"に変換しています。

hex()関数は、結果に0xプレフィックスを付加します。

16進数の演算

Pythonでは、16進数を直接扱うことができるため、加算、減算、乗算、除算といった基本的な演算も簡単に行えます。

ここでは、それぞれの演算について解説します。

16進数の加算

16進数の加算は、通常の整数の加算と同様に行います。

以下のように、16進数リテラルを使って加算を行います。

hex_value1 = 0x1A
hex_value2 = 0x2B
result = hex_value1 + hex_value2
print(hex(result))  # 0x45
0x45

このコードでは、0x1A0x2Bを加算し、結果を16進数で表示しています。

16進数の減算

16進数の減算も、通常の整数の減算と同様に行います。

以下のように記述します。

hex_value1 = 0xFF
hex_value2 = 0x1A
result = hex_value1 - hex_value2
print(hex(result))  # 0xe5
0xe5

このコードでは、0xFFから0x1Aを減算し、結果を16進数で表示しています。

16進数の乗算

16進数の乗算も、通常の整数の乗算と同様に行います。

以下のように記述します。

hex_value1 = 0x3
hex_value2 = 0x4
result = hex_value1 * hex_value2
print(hex(result))  # 0xc
0xc

このコードでは、0x30x4を乗算し、結果を16進数で表示しています。

16進数の除算

16進数の除算も、通常の整数の除算と同様に行います。

ただし、結果は整数として返されるため、必要に応じて浮動小数点数に変換することができます。

hex_value1 = 0xA
hex_value2 = 0x2
result = hex_value1 / hex_value2
print(hex(result))  # 0x5.0
0x5.0

このコードでは、0xA0x2で除算し、結果を16進数で表示しています。

結果は浮動小数点数として表示されます。

16進数とビット操作

Pythonでは、16進数をビット単位で操作することができます。

ビット演算は、特に低レベルのプログラミングやハードウェア制御において非常に重要です。

ここでは、AND演算、OR演算、XOR演算、NOT演算、シフト演算について解説します。

AND演算

AND演算は、対応するビットが両方とも1の場合にのみ1を返します。

16進数でも同様に適用できます。

hex_value1 = 0xF0  # 11110000
hex_value2 = 0x0F  # 00001111
result = hex_value1 & hex_value2
print(hex(result))  # 0x0
0x0

このコードでは、0xF00x0FのAND演算を行い、結果は0x0になります。

OR演算

OR演算は、対応するビットのいずれかが1の場合に1を返します。

hex_value1 = 0xF0  # 11110000
hex_value2 = 0x0F  # 00001111
result = hex_value1 | hex_value2
print(hex(result))  # 0xff
0xff

このコードでは、0xF00x0FのOR演算を行い、結果は0xFFになります。

XOR演算

XOR演算は、対応するビットが異なる場合に1を返します。

hex_value1 = 0xF0  # 11110000
hex_value2 = 0x0F  # 00001111
result = hex_value1 ^ hex_value2
print(hex(result))  # 0xff
0xff

このコードでは、0xF00x0FのXOR演算を行い、結果は0xFFになります。

NOT演算

NOT演算は、ビットを反転させます。

Pythonでは、ビット反転演算子~を使用します。

hex_value = 0x0F  # 00001111
result = ~hex_value
print(hex(result & 0xFF))  # 0xf0
0xf0

このコードでは、0x0Fのビットを反転させ、結果を0xF0として表示しています。

& 0xFFを使って、結果を8ビットに制限しています。

シフト演算

シフト演算は、ビットを左または右に移動させる操作です。

左シフトは<<、右シフトは>>を使用します。

hex_value = 0x01  # 00000001
left_shift = hex_value << 4  # 左に4ビットシフト
right_shift = hex_value >> 1  # 右に1ビットシフト
print(hex(left_shift))  # 0x10
print(hex(right_shift))  # 0x0
0x10
0x0

このコードでは、0x01を左に4ビットシフトして0x10、右に1ビットシフトして0x0を得ています。

シフト演算は、数値を2の冪乗倍に増減させるのに便利です。

16進数のフォーマット

Pythonでは、16進数をさまざまな方法でフォーマットすることができます。

ここでは、フォーマット関数、f-string、formatメソッドを使ったフォーマットの方法について解説します。

フォーマット関数の使い方

format()関数を使用すると、数値を16進数形式でフォーマットできます。

{:x}{:X}を使って、16進数の小文字または大文字で表示できます。

decimal_value = 255
hex_lower = format(decimal_value, 'x')
hex_upper = format(decimal_value, 'X')
print(hex_lower)  # ff
print(hex_upper)  # FF
ff
FF

このコードでは、255を小文字と大文字の16進数形式で表示しています。

f-stringを使ったフォーマット

Python 3.6以降では、f-stringを使用して簡単にフォーマットできます。

{}内に変数を直接埋め込むことができ、:x:Xを使って16進数形式に変換できます。

decimal_value = 255
hex_lower = f"{decimal_value:x}"
hex_upper = f"{decimal_value:X}"
print(hex_lower)  # ff
print(hex_upper)  # FF
ff
FF

このコードでは、f-stringを使って255を小文字と大文字の16進数形式で表示しています。

formatメソッドを使ったフォーマット

format()メソッドを使っても、16進数形式でのフォーマットが可能です。

{}内にフォーマット指定子を記述します。

decimal_value = 255
hex_lower = "{:x}".format(decimal_value)
hex_upper = "{:X}".format(decimal_value)
print(hex_lower)  # ff
print(hex_upper)  # FF
ff
FF

このコードでは、format()メソッドを使用して255を小文字と大文字の16進数形式で表示しています。

どの方法も簡単に16進数をフォーマットできるため、用途に応じて使い分けることができます。

応用例

Pythonでの16進数の扱いは、さまざまな実用的なシナリオで役立ちます。

ここでは、カラーコードの扱い、メモリダンプの解析、バイナリデータの操作について具体的な例を紹介します。

カラーコードの扱い

Webデザインやグラフィックデザインでは、色を16進数で表現することが一般的です。

例えば、RGBカラーコードは#RRGGBBの形式で表されます。

Pythonを使って、カラーコードを操作することができます。

def hex_to_rgb(hex_color):
    hex_color = hex_color.lstrip('#')
    return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
color_code = "#FF5733"
rgb_value = hex_to_rgb(color_code)
print(rgb_value)  # (255, 87, 51)
(255, 87, 51)

このコードでは、16進数のカラーコード#FF5733をRGB形式に変換しています。

メモリダンプの解析

メモリダンプは、プログラムのメモリの状態を16進数で表示したものです。

Pythonを使って、メモリダンプを解析し、特定のデータを抽出することができます。

def parse_memory_dump(dump):
    for i in range(0, len(dump), 16):
        line = dump[i:i+16]
        print(f"{i:04x}: {line}")
memory_dump = "48656c6c6f20576f726c6421"  # "Hello World!"の16進数表現
parse_memory_dump(memory_dump)
0000: 48656c6c6f20576f
0010: 726c6421

このコードでは、16進数のメモリダンプを解析し、各行を表示しています。

バイナリデータの操作

バイナリデータを扱う際にも、16進数は重要です。

Pythonでは、バイナリファイルを読み込み、16進数で表示することができます。

def read_binary_file(file_path):
    with open(file_path, 'rb') as file:
        byte = file.read(1)
        while byte:
            print(hex(ord(byte)), end=' ')
            byte = file.read(1)
# バイナリファイルのパスを指定
# read_binary_file('example.bin')

実行例(ファイルの内容による):

0x41 0x42 0x43 ...

このコードでは、指定したバイナリファイルを読み込み、各バイトを16進数で表示しています。

バイナリデータの解析や操作に役立ちます。

よくある質問

16進数と2進数の変換方法は?

16進数と2進数の変換は、Pythonのbin()int()関数を使って簡単に行えます。

例えば、16進数の文字列を2進数に変換するには、int(hex_string, 16)で整数に変換し、その後bin()を使います。

逆に、2進数を16進数に変換するには、hex()を使用します。

16進数の桁数を揃える方法は?

16進数の桁数を揃えるには、zfill()メソッドやフォーマット指定子を使用します。

例えば、"{:02x}".format(value)hex_value.zfill(4)を使うことで、指定した桁数にゼロパディングすることができます。

16進数の負の数の表現方法は?

16進数で負の数を表現するには、通常は2の補数を使用します。

Pythonでは、負の整数をそのまま16進数に変換することができ、hex(-value)のように記述します。

表示される形式は、負の符号が付いた整数として扱われます。

まとめ

この記事では、Pythonにおける16進数の扱い方について詳しく解説しました。

16進数の基本的な表現から演算、ビット操作、フォーマット方法、さらには実用的な応用例まで幅広くカバーしました。

これを機に、16進数を活用したプログラミングに挑戦してみてください。

  • URLをコピーしました!
目次から探す