Pythonによる2進数変換とビットごとの論理演算(OR, XOR)

Pythonには、整数と2進数文字列の変換や、ビットごとの論理演算を行うための組み込み関数や演算子が用意されています。ここでは、それらの基本的な使い方と、カスタム関数での実装例を紹介します。

2進数変換

Pythonの組み込み関数 bin() を使うと、整数を “0b” プレフィックス付きの2進数文字列に変換できます。

num = 10
binary_str = bin(num)
print(f"整数 {num} の2進数表現: {binary_str}") # 出力: 整数 10 の2進数表現: 0b1010

カスタム関数での2進数表現の準備

ビットごとの論理演算を行うために、2つの数値を同じ長さの2進数リストに変換し、短い方に0をパディングする関数を実装します。

def prepare_binary_lists(num1, num2):
    # bin()で2進数文字列に変換し、'0b'プレフィックスを除去
    bin_str1 = bin(num1)[2:]
    bin_str2 = bin(num2)[2:]

    # 長さを揃えるために短い方に0をパディング
    max_len = max(len(bin_str1), len(bin_str2))
    bin_list1 = [int(bit) for bit in bin_str1.zfill(max_len)]
    bin_list2 = [int(bit) for bit in bin_str2.zfill(max_len)]
    
    return bin_list1, bin_list2

# 例
b1, b2 = prepare_binary_lists(3, 5)
print(f"3の2進数リスト: {b1}") # 出力: 3の2進数リスト: [0, 1, 1]
print(f"5の2進数リスト: {b2}") # 出力: 5の2進数リスト: [1, 0, 1]

10進数変換

2進数リストを10進数に変換する関数です。

def binary_list_to_decimal(binary_list):
    decimal_num = 0
    power = 0
    # 2進数リストを右から左へ処理
    for bit in reversed(binary_list):
        if bit == 1:
            decimal_num += (2 ** power)
        power += 1
    return decimal_num

# 例
print(f"[1, 0, 1] を10進数に変換: {binary_list_to_decimal([1, 0, 1])}") # 出力: [1, 0, 1] を10進数に変換: 5

ビットごとのOR演算

PythonにはビットごとのOR演算子 | が組み込まれています。

result_or = 3 | 5
print(f"3 (0b011) OR 5 (0b101) = {result_or} (0b{bin(result_or)[2:]})") # 出力: 3 (0b011) OR 5 (0b101) = 7 (0b111)

カスタム関数でのOR演算

def custom_or(num1, num2):
    bin_list1, bin_list2 = prepare_binary_lists(num1, num2)
    or_result_list = []
    for i in range(len(bin_list1)):
        if bin_list1[i] == 1 or bin_list2[i] == 1:
            or_result_list.append(1)
        else:
            or_result_list.append(0)
    return binary_list_to_decimal(or_result_list)

# 例
print(f"カスタムOR関数: 3 OR 5 = {custom_or(3, 5)}") # 出力: カスタムOR関数: 3 OR 5 = 7

ビットごとのXOR演算

PythonにはビットごとのXOR演算子 ^ が組み込まれています。

result_xor = 3 ^ 5
print(f"3 (0b011) XOR 5 (0b101) = {result_xor} (0b{bin(result_xor)[2:]})") # 出力: 3 (0b011) XOR 5 (0b101) = 6 (0b110)

カスタム関数でのXOR演算

def custom_xor(num1, num2):
    bin_list1, bin_list2 = prepare_binary_lists(num1, num2)
    xor_result_list = []
    for i in range(len(bin_list1)):
        if bin_list1[i] != bin_list2[i]: # ビットが異なる場合
            xor_result_list.append(1)
        else:
            xor_result_list.append(0)
    return binary_list_to_decimal(xor_result_list)

# 例
print(f"カスタムXOR関数: 3 XOR 5 = {custom_xor(3, 5)}") # 出力: カスタムXOR関数: 3 XOR 5 = 6

まとめ

Pythonでは、ビットごとの論理演算は組み込みの演算子 | (OR) と ^ (XOR) を使うのが最も効率的で推奨されます。カスタム関数は、これらの演算の仕組みを理解するための学習目的として役立ちます。