2進数とコンピューティング思考
このトピックを終えると
コンピュータがなぜ2進数を使うのかを理解し、10進数と2進数の変換ができ、テキストや色が内部的にどのように表現されるかを説明できるようになります。
なぜコンピュータは0と1だけを使うのか
コンピュータの中核部品であるトランジスタは、2つの状態しか持たず、電流が流れる(1)か、流れない(0)かのどちらかです。数十億個のトランジスタが集まってCPUを構成し、それぞれが0または1を表現します。
人間は指が10本あるため10進数を使います。コンピュータは状態が2つあるため2進数を使います。それだけです。
10進数 vs 2進数
10進数で254は:
2 × 10² + 5 × 10¹ + 4 × 10⁰
= 200 + 50 + 4
= 2542進数で11111110は:
1×2⁷ + 1×2⁶ + 1×2⁵ + 1×2⁴ + 1×2³ + 1×2² + 1×2¹ + 0×2⁰
= 128 + 64 + 32 + 16 + 8 + 4 + 2 + 0
= 254同じ原理です。桁ごとに10の累乗ではなく、2の累乗を掛けます。
Pythonで変換
# 10進数 → 2進数print(bin(254)) # '0b11111110'print(bin(42)) # '0b101010'
# 2進数 → 10進数print(int('11111110', 2)) # 254print(int('101010', 2)) # 42
# 16進数(2進数の省略)print(hex(254)) # '0xfe'print(int('fe', 16)) # 2540bは2進数、0xは16進数を表す接頭辞です。
ビットとバイト
- ビット(bit):0または1、情報の最小単位
- バイト(byte):8ビット = 1バイト
1 bit → 2つの値 (0または1)
2 bits → 4つの値 (00, 01, 10, 11)
3 bits → 8つの値 (000 ~ 111)
8 bits → 256つの値 (00000000 ~ 11111111)nビットで表現できる値の個数は2ⁿです。
| 単位 | サイズ | おおよその用途 |
|---|---|---|
| 1 byte | 8 bits | 英字1文字 |
| 1 KB | 1,024 bytes | 短いテキストファイル |
| 1 MB | 1,024 KB | 高解像度写真1枚 |
| 1 GB | 1,024 MB | 映画1本(SD) |
| 1 TB | 1,024 GB | 大容量ハードディスク |
テキストの2進数表現 — ASCIIとUnicode
コンピュータに「文字」という概念はありません。すべての文字は数値に対応されます。
ASCII — 英字128文字
# 文字 → ASCIIコードprint(ord('A')) # 65print(ord('a')) # 97print(ord('0')) # 48print(ord(' ')) # 32
# ASCIIコード → 文字print(chr(65)) # 'A'print(chr(97)) # 'a'print(chr(48)) # '0''A' = 65 = 01000001 (2進数)
'B' = 66 = 01000010
'a' = 97 = 01100001
'0' = 48 = 00110000ASCIIは7ビットで128文字を表現します — 英字の大文字小文字、数字、特殊文字。しかし、韓国語、日本語、中国語は表現できません。
Unicode — 世界中の文字
print(ord('가')) # 44032print(ord('한')) # 54620print(hex(ord('가'))) # '0xac00'
print(chr(44032)) # '가'print(chr(127829)) # '🍕' (ピザの絵文字)
# UTF-8エンコーディング — バイト数を確認print('A'.encode('utf-8')) # b'A' — 1 byteprint('가'.encode('utf-8')) # b'\xea\xb0\x80' — 3 bytesprint('🍕'.encode('utf-8')) # b'\xf0\x9f\x8d\x95' — 4 bytesUnicodeは14万+文字を含みます。UTF-8はUnicodeを保存する方法で、英語は1バイト、韓国語は3バイト、絵文字は4バイトを使用します。
色の2進数表現 — RGB
画面のすべての色は、**赤(R)、緑(G)、青(B)**の3つの値の組み合わせです。各値は0〜255(1バイト)。
# RGB値 → 16進数カラーコードr, g, b = 255, 128, 0hex_color = f"#{r:02x}{g:02x}{b:02x}"print(hex_color) # #ff8000 (オレンジ)
# 16進数 → RGBhex_str = "ff8000"r = int(hex_str[0:2], 16) # 255g = int(hex_str[2:4], 16) # 128b = int(hex_str[4:6], 16) # 0| 色 | R | G | B | 16進数 |
|---|---|---|---|---|
| 赤 | 255 | 0 | 0 | #ff0000 |
| 緑 | 0 | 255 | 0 | #00ff00 |
| 青 | 0 | 0 | 255 | #0000ff |
| 白 | 255 | 255 | 255 | #ffffff |
| 黒 | 0 | 0 | 0 | #000000 |
CSSで#ff8000と書くとき、これはR=255, G=128, B=0を16進数で表現したものです。各チャンネルは8ビット × 3 = 24ビット、約1,677万色の色を表現できます。
負の数の表現方法 — 2の補数
2進数は0と1しかないのに、負の数はどのように表現するのでしょうか?コンピュータは2の補数(Two's Complement) を使用します。
8ビット基準で5と-5を見てみましょう。
5 = 00000101
-5 = 111110112の補数を作る方法:すべてのビットを反転(0→1、1→0)した後、1を足します。
5 = 00000101
反転 = 11111010
+1 = 11111011 → これが-5# Pythonで確認print(bin(5)) # 0b101print(bin(-5 & 0xff)) # 0b11111011 (8ビット基準)
# 2の補数の利点:加算回路1つで減算も可能# 5 + (-5) = 00000101 + 11111011 = 100000000# 9ビット目は切り捨て → 00000000 = 0 (正確!)この方式のおかげで、CPUは専用の減算回路なしに、加算回路のみで減算を処理します。
8ビット2の補数で表現できる範囲:-128〜+127(合計256個)。
ビット演算 — 0と1の直接操作
プログラミングでビットを直接操作する演算があります。
a = 0b1100 # 12b = 0b1010 # 10
# AND — どちらも1なら1print(bin(a & b)) # 0b1000 (8)
# OR — どちらか1なら1print(bin(a | b)) # 0b1110 (14)
# XOR — 異なれば1print(bin(a ^ b)) # 0b0110 (6)
# NOT — 反転print(bin(~a & 0xf)) # 0b0011 (3)
# Shift — ビットを左/右にずらすprint(a << 1) # 24 (12 × 2)print(a >> 1) # 6 (12 ÷ 2)左シフト(<<)は×2、右シフト(>>)は÷2の効果があります。乗算/除算よりも高速であるため、パフォーマンスが重要な低レベルコードで使用されます。
実践 — ビットフラグで権限管理
Linuxファイルの権限(chmod 755)はビット演算で動作します。
READ = 0b100 # 4WRITE = 0b010 # 2EXECUTE = 0b001 # 1
# 権限の設定(ORで結合)user_perm = READ | WRITE | EXECUTE # 0b111 = 7group_perm = READ | EXECUTE # 0b101 = 5other_perm = READ | EXECUTE # 0b101 = 5
print(f"chmod {user_perm}{group_perm}{other_perm}") # chmod 755
# 権限の確認(ANDで検査)has_write = bool(user_perm & WRITE) # Truehas_write_g = bool(group_perm & WRITE) # Falsechmod 755の意味:所有者(7=rwx)、グループ(5=r-x)、その他(5=r-x)。各数字は3ビットの10進表現です。
主要なまとめ
| 概念 | 整理 |
|---|---|
| 2進数 | 0と1で全ての数字を表現。コンピュータの基本言語 |
| ビット | 情報の最小単位(0または1) |
| バイト | 8ビット。0〜255の範囲の値 |
| ASCII | 英字を数値に対応(7ビット、128文字) |
| Unicode | 世界中の文字(14万+)。UTF-8で保存 |
| RGB | 色を3つの値(0〜255)で表現。24ビット = 1,677万色 |
プログラミングをしながら2進数を直接計算することはあまりありません。しかし、「コンピュータはすべてのものを数値で、その数値を0と1で表現する」という事実を理解すれば、ファイルサイズ、エンコーディングエラー、カラーコード、ビットフラグなどの概念が自然に理解できます。2の補数を理解すれば、整数のオーバーフローがなぜ発生するのか、ビット演算を理解すれば、権限システム(chmod)がなぜ777なのかを説明できます。