コンピュータは 0 と 1 しか扱えない。これがすべての出発点。「なぜ 0-9 を全部使わない?」という素朴な疑問から、トランジスタ・論理回路・ビット演算まで、CS の最深層を見ていきます。
1. なぜ 2 進数なのか
- 電圧の制約: 「高い」「低い」の 2 状態は確実に区別できる、10 段階は誤判定が起きやすい
- 回路の単純さ: AND / OR / NOT の 3 種類のゲートだけで全演算ができる
- ノイズ耐性: ノイズが乗っても 0/1 の判定は壊れにくい
- 経済性: 単純な回路 = 安く大量に作れる
2. 10 進と 2 進の対応
| 10 進 | 2 進 | 16 進 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 5 | 0101 | 5 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 15 | 1111 | F |
| 16 | 10000 | 10 |
| 255 | 11111111 | FF |
| 256 | 100000000 | 100 |
| 1024 | 10000000000 | 400 |
3. Python で実験
Python での進数変換
Python
# 10 進 → 2 進 / 16 進print(bin(9)) # '0b1001'print(hex(255)) # '0xff'print(oct(8)) # '0o10'
# 2 進 → 10 進print(int('1001', 2)) # 9print(int('FF', 16)) # 255
# Python での 2 進リテラルx = 0b1010 # 10y = 0xFF # 255
# ビット演算print(0b1100 & 0b1010) # AND → 0b1000 = 8print(0b1100 | 0b1010) # OR → 0b1110 = 14print(0b1100 ^ 0b1010) # XOR → 0b0110 = 6print(~0b1010) # NOT → -11 (2 の補数表現)print(0b1 << 4) # 左シフト → 0b10000 = 164. ビット 8 個 = 1 バイト
1 バイト (8 ビット) で 256 通り (= 2^8) の値を表現可能。これが英数字 1 文字、ファイルサイズの基本単位、IP アドレスの 1 オクテット (192 → 8 ビット) などの基準になっています。
- 1 KB = 1024 バイト (= 2^10)
- 1 MB = 1024 KB (= 2^20)
- 1 GB = 1024 MB (= 2^30) ≒ 10 億バイト
- 1 TB = 1024 GB (= 2^40) ≒ 1 兆バイト
5. 論理回路 (AND / OR / NOT) の意味
| A | B | AND | OR | XOR | NAND |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
NAND ゲートだけで何でも作れる
NAND (NOT AND) ゲート 1 種類だけあれば、AND / OR / NOT / XOR 等の他のゲートをすべて組合せで作れます。これが「コンピュータは究極的にシンプル」と言われる根拠。CPU の数億トランジスタは、概念的には NAND ゲートの組合せ。
6. ビット演算の実用例
- フラグ管理: 1 バイトで 8 つの ON/OFF 状態を表現 (Linux のファイル権限 chmod 等)
- 画像処理: 各ピクセルの RGB 値の高速操作
- ネットワーク: IP アドレスのサブネット計算 (192.168.1.0/24 の /24)
- 暗号: XOR を使った簡易暗号化 (本格的でないが原理学習に最適)
7. 次の話
EP.03 では 文字コード (Shift_JIS / UTF-8 / Unicode) を扱います。「なぜ文字化けが起きるのか」を、2 進数の話と接続して理解します。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。