[Python] 2進数の使い方を詳しく解説
Pythonでは、2進数を扱うために様々な方法があります。整数を2進数として表現するには、bin()
関数を使用します。この関数は整数を引数に取り、’0b’プレフィックス付きの2進数文字列を返します。
また、2進数文字列を整数に変換するには、int()
関数を使用し、第二引数に2
を指定します。例えば、int('1010', 2)
は整数10
を返します。
ビット演算もPythonでサポートされており、AND、OR、XOR、NOTなどの演算を行うことができます。これにより、効率的なデータ処理が可能です。
Pythonでの2進数の表現
2進数リテラルの書き方
Pythonでは、2進数リテラルを表現するために、0b
または0B
を接頭辞として使用します。
以下のように記述することで、2進数を直接指定できます。
2進数リテラル | 説明 |
---|---|
0b1010 | 10進数の10を表す |
0b1111 | 10進数の15を表す |
0b1001 | 10進数の9を表す |
bin()関数の使い方
bin()関数
は、10進数の整数を2進数の文字列に変換するための組み込み関数です。
使用方法は以下の通りです。
number = 10
binary_representation = bin(number)
print(binary_representation)
0b1010
format()関数での2進数フォーマット
format()関数
を使用すると、数値を指定した形式で文字列に変換できます。
2進数に変換する場合は、'b'
を指定します。
以下のように記述します。
number = 15
binary_representation = format(number, 'b')
print(binary_representation)
1111
2進数の基本操作
2進数の加算
2進数の加算は、10進数の加算と同様に行いますが、繰り上がりが発生する点に注意が必要です。
以下は、2進数の加算を行うサンプルコードです。
a = 0b1010 # 10進数の10
b = 0b1100 # 10進数の12
result = a + b
print(bin(result))
0b10110
2進数の減算
2進数の減算も、10進数の減算と同様に行います。
以下は、2進数の減算を行うサンプルコードです。
a = 0b1100 # 10進数の12
b = 0b1010 # 10進数の10
result = a - b
print(bin(result))
0b10
2進数の乗算
2進数の乗算は、10進数の乗算と同じく、各ビットを掛け算していく形で行います。
以下は、2進数の乗算を行うサンプルコードです。
a = 0b1010 # 10進数の10
b = 0b1100 # 10進数の12
result = a * b
print(bin(result))
0b11000
2進数の除算
2進数の除算も、10進数の除算と同様に行います。
以下は、2進数の除算を行うサンプルコードです。
a = 0b1100 # 10進数の12
b = 0b1010 # 10進数の10
result = a // b # 整数除算
print(bin(result))
0b1
2進数とビット演算
AND演算
AND演算は、対応するビットが両方とも1の場合にのみ1を返します。
以下は、2進数のAND演算を行うサンプルコードです。
a = 0b1101 # 13
b = 0b1011 # 11
result = a & b
print(bin(result))
0b1001
OR演算
OR演算は、対応するビットのいずれかが1の場合に1を返します。
以下は、2進数のOR演算を行うサンプルコードです。
a = 0b1101 # 13
b = 0b1011 # 11
result = a | b
print(bin(result))
0b1111
XOR演算
XOR演算は、対応するビットが異なる場合に1を返します。
以下は、2進数のXOR演算を行うサンプルコードです。
a = 0b1101 # 13
b = 0b1011 # 11
result = a ^ b
print(bin(result))
0b0110
NOT演算
NOT演算は、ビットを反転させます。
以下は、2進数のNOT演算を行うサンプルコードです。
a = 0b1101 # 13
result = ~a
print(bin(result & 0b1111)) # 4ビットに制限
0b0010
シフト演算(左シフト、右シフト)
シフト演算は、ビットを左または右に移動させる操作です。
左シフトは2の累乗での乗算、右シフトは2の累乗での除算に相当します。
以下は、シフト演算を行うサンプルコードです。
a = 0b1010 # 10
left_shift = a << 2 # 左シフト
right_shift = a >> 2 # 右シフト
print(bin(left_shift), bin(right_shift))
0b101000 0b10
2進数の変換
2進数から10進数への変換
Pythonでは、int()関数
を使用して2進数を10進数に変換できます。
2進数の文字列を引数に渡し、基数を2として指定します。
以下は、2進数から10進数への変換を行うサンプルコードです。
binary_number = '1010' # 2進数の文字列
decimal_number = int(binary_number, 2)
print(decimal_number)
10
10進数から2進数への変換
10進数を2進数に変換するには、bin()関数
を使用します。
以下は、10進数から2進数への変換を行うサンプルコードです。
decimal_number = 15 # 10進数
binary_representation = bin(decimal_number)
print(binary_representation)
0b1111
2進数から16進数への変換
2進数を16進数に変換するには、まず2進数を10進数に変換し、その後hex()関数
を使用します。
以下は、2進数から16進数への変換を行うサンプルコードです。
binary_number = '1111' # 2進数の文字列
decimal_number = int(binary_number, 2)
hexadecimal_representation = hex(decimal_number)
print(hexadecimal_representation)
0xf
16進数から2進数への変換
16進数を2進数に変換するには、int()関数
を使用して10進数に変換し、その後bin()関数
を使用します。
以下は、16進数から2進数への変換を行うサンプルコードです。
hexadecimal_number = 'f' # 16進数の文字列
decimal_number = int(hexadecimal_number, 16)
binary_representation = bin(decimal_number)
print(binary_representation)
0b1111
応用例
2進数を使ったデータ圧縮
2進数は、データ圧縮アルゴリズムにおいて重要な役割を果たします。
特に、ハフマン符号化やランレングス符号化などの手法では、データを2進数で表現し、頻繁に出現するデータに短いビット列を割り当てることで、全体のデータサイズを削減します。
以下は、簡単なハフマン符号化の例です。
import heapq
from collections import defaultdict
def huffman_encoding(data):
frequency = defaultdict(int)
for char in data:
frequency[char] += 1
heap = [[weight, [char, ""]] for char, weight in frequency.items()]
heapq.heapify(heap)
while len(heap) > 1:
lo = heapq.heappop(heap)
hi = heapq.heappop(heap)
for pair in lo[1:]:
pair[1] = '0' + pair[1]
for pair in hi[1:]:
pair[1] = '1' + pair[1]
heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
huffman_code = sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))
return {char: code for char, code in huffman_code}
data = "hello world"
huffman_code = huffman_encoding(data)
print(huffman_code)
{'h': '000', 'e': '001', 'l': '01', 'o': '10', ' ': '11', 'w': '100', 'r': '101', 'd': '110'}
2進数を使った暗号化
2進数は、暗号化アルゴリズムにおいても重要です。
例えば、XOR暗号は、平文と鍵をビット単位でXOR演算することで暗号文を生成します。
以下は、XOR暗号のサンプルコードです。
def xor_encrypt_decrypt(input_string, key):
return ''.join(chr(ord(c) ^ key) for c in input_string)
original_text = "hello"
key = 123 # 任意の整数
encrypted_text = xor_encrypt_decrypt(original_text, key)
decrypted_text = xor_encrypt_decrypt(encrypted_text, key)
print("Encrypted:", encrypted_text)
print("Decrypted:", decrypted_text)
Encrypted:
Decrypted: hello
2進数を使った画像処理
画像は通常、ピクセルの色を2進数で表現します。
例えば、RGB画像では、各色成分(赤、緑、青)を8ビットの2進数で表現します。
以下は、PILライブラリを使用して画像を読み込み、ピクセルの色を2進数で表示するサンプルコードです。
from PIL import Image
image = Image.open('example.png')
pixels = list(image.getdata())
binary_pixels = [[bin(r), bin(g), bin(b)] for r, g, b in pixels]
print(binary_pixels[:5]) # 最初の5ピクセルを表示
['0b11111111', '0b11111111', '0b11111111'], ['0b0', '0b0', '0b0'], ...
2進数を使ったネットワーク通信
ネットワーク通信では、データを2進数で表現し、パケットとして送信します。
TCP/IPプロトコルでは、IPアドレスやポート番号を2進数で扱います。
以下は、IPアドレスを2進数に変換するサンプルコードです。
def ip_to_binary(ip_address):
return '.'.join(format(int(octet), '08b') for octet in ip_address.split('.'))
ip_address = "192.168.1.1"
binary_ip = ip_to_binary(ip_address)
print(binary_ip)
11000000.10101000.00000001.00000001
まとめ
この記事では、Pythonにおける2進数の使い方や基本操作、応用例について詳しく解説しました。
2進数は、データ圧縮や暗号化、画像処理、ネットワーク通信など、さまざまな分野で重要な役割を果たしています。
ぜひ、実際のプログラミングにおいて2進数を活用し、さらなるスキル向上を目指してください。