[Python] 16進数の使い方
Pythonでは、16進数を簡単に扱うことができます。整数を16進数に変換するには、hex()関数を使用します。
例えば、hex(255)は'0xff'を返します。16進数を整数に変換するには、int()関数を使用し、基数を指定します。
例として、int('ff', 16)は255を返します。文字列フォーマットを使用して16進数を表示することも可能です。
フォーマット文字列'{:x}'を使うと、整数を16進数で表現できます。
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) # 25526
255このコードでは、16進数リテラルを変数に代入し、10進数として出力しています。
文字列から16進数への変換
文字列を16進数に変換するには、int()関数を使用します。
文字列を引数に渡し、基数を16に指定します。
hex_string = "1A"
hex_value = int(hex_string, 16)
print(hex_value) # 2626このコードでは、文字列"1A"を16進数として解釈し、10進数の26に変換しています。
16進数から文字列への変換
16進数を文字列に変換するには、hex()関数を使用します。
この関数は、整数を16進数の文字列に変換します。
decimal_value = 26
hex_string = hex(decimal_value)
print(hex_string) # 0x1a0x1aこのコードでは、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)) # 0x450x45このコードでは、0x1Aと0x2Bを加算し、結果を16進数で表示しています。
16進数の減算
16進数の減算も、通常の整数の減算と同様に行います。
以下のように記述します。
hex_value1 = 0xFF
hex_value2 = 0x1A
result = hex_value1 - hex_value2
print(hex(result)) # 0xe50xe5このコードでは、0xFFから0x1Aを減算し、結果を16進数で表示しています。
16進数の乗算
16進数の乗算も、通常の整数の乗算と同様に行います。
以下のように記述します。
hex_value1 = 0x3
hex_value2 = 0x4
result = hex_value1 * hex_value2
print(hex(result)) # 0xc0xcこのコードでは、0x3と0x4を乗算し、結果を16進数で表示しています。
16進数の除算
16進数の除算も、通常の整数の除算と同様に行います。
ただし、結果は整数として返されるため、必要に応じて浮動小数点数に変換することができます。
hex_value1 = 0xA
hex_value2 = 0x2
result = hex_value1 / hex_value2
print(hex(result)) # 0x5.00x5.0このコードでは、0xAを0x2で除算し、結果を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)) # 0x00x0このコードでは、0xF0と0x0FのAND演算を行い、結果は0x0になります。
OR演算
OR演算は、対応するビットのいずれかが1の場合に1を返します。
hex_value1 = 0xF0 # 11110000
hex_value2 = 0x0F # 00001111
result = hex_value1 | hex_value2
print(hex(result)) # 0xff0xffこのコードでは、0xF0と0x0FのOR演算を行い、結果は0xFFになります。
XOR演算
XOR演算は、対応するビットが異なる場合に1を返します。
hex_value1 = 0xF0 # 11110000
hex_value2 = 0x0F # 00001111
result = hex_value1 ^ hex_value2
print(hex(result)) # 0xff0xffこのコードでは、0xF0と0x0FのXOR演算を行い、結果は0xFFになります。
NOT演算
NOT演算は、ビットを反転させます。
Pythonでは、ビット反転演算子~を使用します。
hex_value = 0x0F # 00001111
result = ~hex_value
print(hex(result & 0xFF)) # 0xf00xf0このコードでは、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)) # 0x00x10
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) # FFff
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) # FFff
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) # FFff
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進数で表示しています。
バイナリデータの解析や操作に役立ちます。
まとめ
この記事では、Pythonにおける16進数の扱い方について詳しく解説しました。
16進数の基本的な表現から演算、ビット操作、フォーマット方法、さらには実用的な応用例まで幅広くカバーしました。
これを機に、16進数を活用したプログラミングに挑戦してみてください。