Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Week 1: コンピュータ基礎 プロジェクト・ミーミル

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Hiro Hiro
March 25, 2026
53

Week 1: コンピュータ基礎 プロジェクト・ミーミル

Avatar for Hiro

Hiro

March 25, 2026

Transcript

  1. 今日のアジェンダ 時間 パート 0:00 オリエンテーション(5分) 0:05 講義①: ビットとデータ表現(15分) 0:20 講義②:

    処理の流れ(15分) 0:35 プチテスト 8問(10分) 0:45〜 質疑・まとめ(バッファ) プロジェクト・ミーミル | Week 1 2
  2. 今日のゴール この回が終わったら、以下ができる状態: 1. CPU・レジスタ・メモリ・IOの役割を自分の言葉で説明できる 2. 2進数変換とビット操作を手で計算できる — 頭で分かっているだけじゃなくて、 手が動くこと 3.

    「なぜそうなっているか」のストーリーを持てている — 2の補数がなぜ便利か、 浮動小数点がなぜ誤差を生むか プロジェクト・ミーミル | Week 1 4
  3. この講義がどこで生きるか 領域 実務との接点 面接 「CPUが命令を実行するプロセスを説明してください」 「0.1 + 0.2 が 0.3

    にならないのはなぜですか」→ 今日の内容がそのまま出る フロントエン ド call stack size exceeded エラー(Next.js / React Native)→ スタ ックの話と直結 バックエンド (Go) goroutine → コンテキストスイッチの話と繋がる。メモリリーク → ヒ ープとGCの理解 プロジェクト・ミーミル | Week 1 5
  4. 2進数とは 各桁が ON(1)か OFF(0) しかない。ON なら重みを足す、OFF なら足さない 桁 指数 重み

    覚え方 1桁目 2⁰ 1 前の数を倍にしていくだけ 2桁目 2¹ 2 3桁目 2² 4 4桁目 2³ 8 5桁目 2⁴ 16 6桁目 2⁵ 32 7桁目 2⁶ 64 8桁目 2⁷ 128 プロジェクト・ミーミル | Week 1 8
  5. 2進数の読み方 例: 101010 を10進数に変換 32 16 8 4 2 1

    101010 1 0 1 0 1 0 → 1が立ってる桁だけ足す: 32 + 8 + 2 = 42 プロジェクト・ミーミル | Week 1 9
  6. 10進数 → 2進数の変換 2で割り続けて、余りを下から読む 13 ÷ 2 = 6 ...

    余り 1 ← 1 桁目(重み1 ) 6 ÷ 2 = 3 ... 余り 0 ← 2 桁目(重み2 ) 3 ÷ 2 = 1 ... 余り 1 ← 3 桁目(重み4 ) 1 ÷ 2 = 0 ... 余り 1 ← 4 桁目(重み8 ) → 下から読む: 1101(2) 8 4 2 1 1 1 0 1 検算: 8 + 4 + 0 + 1 = 13 プロジェクト・ミーミル | Week 1 10
  7. 答え合わせ: 25 → 2進数 25 ÷ 2 = 12 ...

    余り 1 ← 1 桁目(重み1 ) 12 ÷ 2 = 6 ... 余り 0 ← 2 桁目(重み2 ) 6 ÷ 2 = 3 ... 余り 0 ← 3 桁目(重み4 ) 3 ÷ 2 = 1 ... 余り 1 ← 4 桁目(重み8 ) 1 ÷ 2 = 0 ... 余り 1 ← 5 桁目(重み16 ) → 下から読む: 11001(2) 16 8 4 2 1 1 1 0 0 1 検算: 16 + 8 + 0 + 0 + 1 = 25 プロジェクト・ミーミル | Week 1 11
  8. 2の補数 コンピュータが 負の数 を表現する標準的な方法 求め方: 全ビット反転 + 1 +5 =

    0000 0101 ↓ 全ビット反転 1111 1010 ↓ +1 -5 = 1111 1011 プロジェクト・ミーミル | Week 1 12
  9. 2の補数: なぜ便利か 加算回路だけで減算もできる! 5 + (-3) を2 進数で計算: 0000 0101

    (+5) + 1111 1101 (-3: 0000 0011 を反転+1) ----------- 0000 0010 = 2 (桁あふれは無視) → ALUに足し算の仕組みさえあれば、引き算もできる → ハードウェアがシンプルにな る プロジェクト・ミーミル | Week 1 13
  10. 浮動小数点: なぜ誤差が出るか 0.1 を2進数に変換してみると… 0.1 × 2 = 0.2 →

    0 0.2 × 2 = 0.4 → 0 0.4 × 2 = 0.8 → 0 0.8 × 2 = 1.6 → 1 0.6 × 2 = 1.2 → 1 0.2 × 2 = 0.4 → 0 ← ここからループ 整数 → 2進数: ÷2 / 小数 → 2進数: ×2 → 無限循環小数 → 有限ビットで打ち切る → 誤差の正体 プロジェクト・ミーミル | Week 1 14
  11. 浮動小数点: 実務での注意 0.1 + 0.2 // → 0.30000000000000004 var a

    float64 = 0.1 var b float64 = 0.2 fmt.Println(a + b) // → 0.30000000000000004 fmt.Println(a + b == 0.3) // → false Go Playground で試す 0.01 を 1000回足すと → 10 じゃなくて 9.99... になる 金額計算では浮動小数点を使わない! → 整数で計算する 参考: メルペイの料率計算における小数の扱い プロジェクト・ミーミル | Week 1 15
  12. ビット操作 操作 記号 説明 AND & 両方1のとき1 → マスク処理 OR

    | どちらか1のとき1 → フラグ設定 XOR ^ 異なるとき1 → スワップ NOT ~ ビット反転 左シフト << ×2 右シフト >> ÷2 プロジェクト・ミーミル | Week 1 16
  13. ビット操作: Goでの実例 // Go: フラグ管理の例 const ( FlagRead = 1

    << 0 // 001 = 1 FlagWrite = 1 << 1 // 010 = 2 FlagExec = 1 << 2 // 100 = 4 ) perm := FlagRead | FlagExec // 101 = 5 fmt.Println(perm&FlagWrite != 0) // false プロジェクト・ミーミル | Week 1 17
  14. CPU・レジスタ・メモリ・IO ┌─────────────────────────┐ │ CPU │ │ ┌─────┐ ┌──────────┐ │ │

    │ ALU │ │ 制御装置 │ │ ┌─────────┐ │ └─────┘ └──────────┘ │ ←→ │ メモリ │ │ ┌──────────────────┐ │ │ (RAM) │ │ │ レジスタ群 │ │ └─────────┘ │ └──────────────────┘ │ └─────────────────────────┘ ┌─────────┐ │ IO │ バス(データの通り道) │ ( 入出力) │ └─────────┘ プロジェクト・ミーミル | Week 1 20
  15. 命令実行サイクル CPUは以下のサイクルを 超高速に繰り返す(3GHz = 秒間30億回) ① フェッチ(Fetch ) → PC

    (プログラムカウンタ)が示すアドレスから命令を読み出す ↓ ② デコード(Decode ) → 制御装置が命令を解読する ↓ ③ 実行(Execute ) → ALU が演算を実行する ↓ ④ ストア(Store ) → 結果をレジスタ/ メモリに書き戻す ↓ ⑤ PC をインクリメント → 次の命令へ プロジェクト・ミーミル | Week 1 22
  16. コンテキストスイッチ OSが 複数プロセスを並行実行 するための仕組み 1. 実行中プロセスの状態を 保存(レジスタ値、PC、SP) 2. 別のプロセスの状態を 復元

    3. 超高速に切り替え → 人間には同時に見える コスト: 切り替え自体にオーバーヘッドがある プロジェクト・ミーミル | Week 1 24
  17. セクション2まとめ: 評価基準との対応 評価基準 対応する内容 CPU、レジスタ、メモリ、IO と処理の流れを説明 できる 構成要素の役割と命令実行サイ クル 命令セットを理解している

    フェッチ→デコード→実行→ス トア コンテキストスイッチを理解している プロセス切り替えの概念 プロジェクト・ミーミル | Week 1 25