なぜ 2 進数なのか
コンピュータの電子回路は「電圧が高い(1)」か「電圧が低い(0)」の 2 状態しか区別できません。そのため、あらゆる情報を 0 と 1 の組み合わせ=**2 進数(Binary)**で表現します。
2 進数 ↔ 10 進数 変換
2 進数 → 10 進数
各桁の値に 2 のべき乗を掛けて足し合わせます。
2進数: 1 0 1 1 0 1
重み: 32 16 8 4 2 1
= 1×32 + 0×16 + 1×8 + 1×4 + 0×2 + 1×1
= 32 + 8 + 4 + 1 = 45(10進数)
10 進数 → 2 進数
2 で割り続けて余りを逆順に並べます。
45 ÷ 2 = 22 … 余り 1
22 ÷ 2 = 11 … 余り 0
11 ÷ 2 = 5 … 余り 1
5 ÷ 2 = 2 … 余り 1
2 ÷ 2 = 1 … 余り 0
1 ÷ 2 = 0 … 余り 1 ← ここが最上位
逆順に読む: 1 0 1 1 0 1 = 101101₂
16 進数(Hexadecimal)
2 進数 4 桁をまとめて 0〜F の 1 文字で表す表記法です。カラーコードやメモリアドレスで多用されます。
| 10進 | 2進 | 16進 |
|---|---|---|
| 0 | 0000 | 0 |
| 9 | 1001 | 9 |
| 10 | 1010 | A |
| 15 | 1111 | F |
| 16 | 0001 0000 | 10 |
2進数: 1010 1111 → 16進数: AF
プログラムでは 0xAF や #FF5733(RGB カラー)のように使います。
論理演算(Boolean Operations)
コンピュータの回路はすべて AND / OR / NOT / XOR の組み合わせで動きます。
| 演算 | 記号 | 意味 | 例(A=1, B=0) |
|---|---|---|---|
| AND | & | 両方 1 なら 1 | 1 & 0 = 0 |
| OR | | | どちらか 1 なら 1 | 1 | 0 = 1 |
| NOT | ~ | 反転 | ~1 = 0 |
| XOR | ^ | 異なれば 1 | 1 ^ 0 = 1 |
SE の現場での利用例
# フラグのビット操作
PERMISSION_READ = 0b001 # 1
PERMISSION_WRITE = 0b010 # 2
PERMISSION_EXEC = 0b100 # 4
user_perm = PERMISSION_READ | PERMISSION_WRITE # 0b011 = 3
# 書き込み権限があるか確認
if user_perm & PERMISSION_WRITE:
print("書き込み可能")
文字コード
ASCII(基本の 128 文字)
英数字・記号を 7 ビット(128 種類)で表します。
'A' = 65 = 0x41 = 0100 0001
'a' = 97 = 0x61 = 0110 0001
'0' = 48 = 0x30 = 0011 0000
Unicode と UTF-8
世界中の文字を統一的に扱うための規格が Unicode です。UTF-8 はその可変長エンコーディングで、ASCII と互換性があります。
'A' → 0x41(1バイト) ← ASCII と同じ
'あ' → 0xE3 0x81 0x82(3バイト)
'😀' → 0xF0 9F 98 80(4バイト)
文字化けの原因
送信側と受信側で文字コードが異なると文字化けが発生します。
Shift-JIS で書いた「こんにちは」を UTF-8 として読むと文字化け
Web サーバーが Content-Type: text/html; charset=UTF-8 を返すのはこのためです。
まとめ
- 2 進数はコンピュータの基本。10 進数との変換を手で追えるようにする
- 16 進数は 2 進数 4 桁のショートハンド
- AND/OR/NOT/XOR はビットフラグの処理やセキュリティ実装でよく使う
- 文字コードは ASCII → Unicode(UTF-8)の流れを押さえる