[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
このコードでは、0x1A
と0x2B
を加算し、結果を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
このコードでは、0x3
と0x4
を乗算し、結果を16進数で表示しています。
16進数の除算
16進数の除算も、通常の整数の除算と同様に行います。
ただし、結果は整数として返されるため、必要に応じて浮動小数点数に変換することができます。
hex_value1 = 0xA
hex_value2 = 0x2
result = hex_value1 / hex_value2
print(hex(result)) # 0x5.0
0x5.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)) # 0x0
0x0
このコードでは、0xF0
と0x0F
のAND演算を行い、結果は0x0
になります。
OR演算
OR演算は、対応するビットのいずれかが1の場合に1を返します。
hex_value1 = 0xF0 # 11110000
hex_value2 = 0x0F # 00001111
result = hex_value1 | hex_value2
print(hex(result)) # 0xff
0xff
このコードでは、0xF0
と0x0F
のOR演算を行い、結果は0xFF
になります。
XOR演算
XOR演算は、対応するビットが異なる場合に1を返します。
hex_value1 = 0xF0 # 11110000
hex_value2 = 0x0F # 00001111
result = hex_value1 ^ hex_value2
print(hex(result)) # 0xff
0xff
このコードでは、0xF0
と0x0F
の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進数で表示しています。
バイナリデータの解析や操作に役立ちます。
よくある質問
まとめ
この記事では、Pythonにおける16進数の扱い方について詳しく解説しました。
16進数の基本的な表現から演算、ビット操作、フォーマット方法、さらには実用的な応用例まで幅広くカバーしました。
これを機に、16進数を活用したプログラミングに挑戦してみてください。