数値

[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進数リテラル説明
0b101010進数の10を表す
0b111110進数の15を表す
0b100110進数の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進数を活用し、さらなるスキル向上を目指してください。

関連記事

Back to top button