※小説ではない※専門書 要約資料集 為替(換算)3.9万円でもらう 紐解集生成 専門 初入門 資料 作:{作者名}
> 学問の宇宙・応用の軌道ステーション群(工学)『PC創造大全』(BOOK-0358・全22部+総論)第1部。ガイド役: Fable 5 監修 / Sonnet 5 執筆(脚本班)
> トーン規約: GAKUMON_UNIVERSE.md準拠。専門用語は初出で必ず説明する。
> **値札**: 足し算から博士号(専門職)までを一冊で貫く統合大型巻の第一歩。「読み切ればPCを作れる場所まで行ける」一本道の、最初の一段。
> **安全枠(§16.18・本部での適用範囲)**: 本部は数値と論理という抽象的な土台だけを扱い、実際の電子部品・電源・配線には一切触れない。部品に手を触れる段階(第2部『電子と部品の物理』以降)からは、静電気対策・電源ユニット(PSU)を絶対に開けないことなど、具体的な安全上の注意が必要になる。本部の内容だけでは電子部品は一切動かせない(考え方の土台にとどまる)。
> 接続先: →BOOK-0002『算術』第1冊(足し算・位取り記数法・ゼロの成り立ちという土台はそちらに詳しい。本部は同じ足し算を「PCの中身を読むための出発点」として再利用し、位取りという考え方を10進法の外へ広げていく)、→BOOK-0066『情報派生 アルゴリズム』第1巻(論理と手順を体系だって扱う道はそちらに接続する)、→次部BOOK-0358b『PC創造大全 第2部 電子と部品の物理』(電圧・電流・抵抗、半導体、トランジスタ、論理ゲートの物理的な実装はそちらが引き継ぐ)。
> 水準: 一〜二(足し算と位取り記数法の一般化という土台から、二進法、二進数の足し算と2の補数、論理代数〈AND・OR・NOT〉、論理回路の組み合わせ〈半加算器・全加算器〉、ビット演算〈マスク・シフト〉、配列の数理〈メモリ番地という巨大な配列〉までを扱う)。
---
# BOOK-0358a PC創造大全 第1部: 数と論理の土台 — 足し算から、PCの中身を読むための最初の言葉へ
> 学問の宇宙・応用の軌道ステーション群(工学)『PC創造大全』(BOOK-0358・全22部+総論)第1部。ガイド役: Fable 5 監修 / Sonnet 5 執筆(脚本班)
> トーン規約: GAKUMON_UNIVERSE.md準拠。専門用語は初出で必ず説明する。
> **値札**: 足し算から博士号(専門職)までを一冊で貫く統合大型巻の第一歩。「読み切ればPCを作れる場所まで行ける」一本道の、最初の一段。
> **安全枠(§16.18・本部での適用範囲)**: 本部は数値と論理という抽象的な土台だけを扱い、実際の電子部品・電源・配線には一切触れない。部品に手を触れる段階(第2部『電子と部品の物理』以降)からは、静電気対策・電源ユニット(PSU)を絶対に開けないことなど、具体的な安全上の注意が必要になる。本部の内容だけでは電子部品は一切動かせない(考え方の土台にとどまる)。
> 接続先: →BOOK-0002『算術』第1冊(足し算・位取り記数法・ゼロの成り立ちという土台はそちらに詳しい。本部は同じ足し算を「PCの中身を読むための出発点」として再利用し、位取りという考え方を10進法の外へ広げていく)、→BOOK-0066『情報派生 アルゴリズム』第1巻(論理と手順を体系だって扱う道はそちらに接続する)、→次部BOOK-0358b『PC創造大全 第2部 電子と部品の物理』(電圧・電流・抵抗、半導体、トランジスタ、論理ゲートの物理的な実装はそちらが引き継ぐ)。
> 水準: 一〜二(足し算と位取り記数法の一般化という土台から、二進法、二進数の足し算と2の補数、論理代数〈AND・OR・NOT〉、論理回路の組み合わせ〈半加算器・全加算器〉、ビット演算〈マスク・シフト〉、配列の数理〈メモリ番地という巨大な配列〉までを扱う)。
---
## 入口の物語 — 「3+4=7」の中に、PCの設計図は隠れている
ある読者が、初めてパソコンのケースを開けたときのことを想像してほしい。基板の上に無数の四角い部品が並び、細い金属の足がびっしりと生えたICチップがあり、その内部では毎秒何十億回もの計算が行われている——と説明書には書いてある。だが、その基板をどれだけ目を凝らして眺めても、「計算をしている」ようにはとても見えない。ただの銀色と黒色の部品の集まりにしか見えないのだ。
この違和感には、実はとても素直な答えがある。パソコンの中で実際に起きていることは、突き詰めれば「小石を3個持ってきて、さらに4個持ってきたら、全部で7個になる」という、あの子供のころに覚えた足し算と、根っこの部分ではまったく同じ作業の、途方もない繰り返しにすぎない。ただし人間が指を折って数えるのとは違うやり方——電気の高い・低いという、たった2つの状態だけを使うやり方——で、その足し算を行っている。そして、その2つの状態をどう組み合わせるかを決めているのが、「かつ(AND)」「または(OR)」「ではない(NOT)」という、これもまた子供でも意味のわかる、ごく単純な3つの判断の道具立てである。
この巻(第1部)がたどるのは、まさにその道筋である。まず、足し算という誰もが知っている作業を、もう一段深く見つめ直すところから始める。次に、その足し算を「0と1だけ」の世界に置き換える方法(二進法)を学ぶ。続いて、0と1に対して「かつ・または・ではない」を組み合わせる数学(論理代数)を身につけ、その組み合わせが実は足し算そのものを組み立てる部品になっていることを、自分の手で確かめる。そして最後に、パソコンの中にある巨大な記憶装置(メモリ)が、実は「番号を付けて並べたものの集まり」という、算数でおなじみの「配列」という考え方そのものであることを見ていく。
一つひとつの内容は、驚くほど単純である。難しい数式は出てこない。だが、この単純な道具立てだけを積み重ねて、現在のパソコンという途方もなく複雑な機械が動いている——その事実こそが、本部全体を通じて伝えたい一番大きな驚きである。足し算から、論理から、配列から、PCの設計を自分の言葉で語れる場所まで、一歩ずつ歩いていこう。
新人技師の話に、もう一つだけ付け加えておきたいことがある。先輩は最後にこう言った。「回路図の記号(→BOOK-0300で扱った内容)も、抵抗やトランジスタという部品(→BOOK-0358b以降で扱う内容)も、最初はどれも別々の知識に見えるかもしれない。でも、たどっていくと、全部が同じ根っこ——数を数え、位取りで表し、真か偽かを判断する、というごく単純な土台——から生えていることに気づくはずだ」。この巻(『PC創造大全』第1部)は、まさにその「根っこ」だけを扱う。ケースを開けた瞬間に目に飛び込んでくる部品や配線そのものは、次部以降のお楽しみとして取っておこう。ここではまず、部品も配線もない、数と論理だけの世界で、静かにじっくりと基礎を固める。急いで組み立てに進みたい気持ちを一度脇に置き、足し算という最初の一歩から、丁寧に積み上げていくことこそが、遠回りに見えて実は一番の近道になる——それが、この巻が伝えたい、もう一つの小さな教訓である。
---
## 第一章: 足し算という土台と、位取り記数法の一般化(水準一)
### 足し算をもう一度、ゆっくり見つめ直す
**足し算(たしざん、水準一: 二つ以上の数量をひとまとめにして、その合計を求める計算)**については、→BOOK-0002第一章ですでに「数え直しの手間を省く裏技」として詳しく扱われている。小石が3個ある場所にさらに4個を持ってくると、全部で7個になる。式で書けば `3 + 4 = 7` である。本部では、この足し算そのものの説明を繰り返すのではなく、足し算を支えているもう一つの発明——**位取り(くらいどり)**という考え方——を、PCの中身を読むために必要な形へと広げていくところから出発する。
### 位取り記数法を、もう一段抽象的に見る
私たちが日常使っている `123` という数字は、右から「一の位が3、十の位が2、百の位が1」という意味を持っている。この、数字を置く場所によって意味が変わる仕組みを、**位取り記数法(くらいどりきすうほう、水準一: 数字を置く場所によって、その数字が表す大きさが変わる記数のしくみ)**と呼ぶ。
この位取り記数法には、実はもう一つ隠れた数字がある。それが**基数(きすう、水準一: 位取り記数法において、一つ上の位に上がるために必要な個数。私たちが日常使う十進法では10がこれにあたる)**である。`123` という数字を、基数を明示した形で書き直すと、次のようになる。
```
123 = 1 × 10² + 2 × 10¹ + 3 × 10⁰
= 1 × 100 + 2 × 10 + 3 × 1
= 100 + 20 + 3 = 123(検算成立)
```
この式が示しているのは、「位取り記数法とは、ある基数のべき乗(累乗)に、0からその基数未満までの数字を掛けて、それを全部足し合わせる仕組みである」という一般的な構造である。私たちが使う十進法(じっしんほう、水準一: 基数を10とする位取り記数法。0から9までの10種類の数字を使う)は、この一般的な仕組みの中で「基数がたまたま10になっている」一つの実例にすぎない。
### なぜ基数は10でなければならないのか — 実は「10でなくてもよい」
人類が基数10を選んだ理由は、単純に「両手の指の本数が10本だから」という説が広く受け入れられている。しかし、位取り記数法という仕組みそのものには、基数を10に固定しなければならない数学的な必然性は一切ない。基数を2にしても、5にしても、12にしても、16にしても、同じ仕組みがそのまま成り立つ。
この事実こそが、本部全体の出発点になる。パソコンの内部には、指も、10本という基準もない。そこにあるのは、電気の「高い」か「低い」かという、たった2つの状態だけである。ならば、基数を2にした位取り記数法を使えばよい——これが次章で扱う二進法の、いちばん素直な動機である。
### 検算1 — 位取り記数法の一般式で、身近な数を検算する
`4185` という数を、位取り記数法の一般式で確かめてみよう。
```
4185 = 4 × 10³ + 1 × 10² + 8 × 10¹ + 5 × 10⁰
= 4 × 1000 + 1 × 100 + 8 × 10 + 5 × 1
= 4000 + 100 + 80 + 5 = 4185(検算成立)
```
一の位・十の位・百の位・千の位という日本語の呼び名は、それぞれ `10⁰`・`10¹`・`10²`・`10³` という、基数10のべき乗に対応している。この対応関係を意識しておくと、次章で基数が2に変わったときにも、まったく同じ理屈がそのまま使えることが、すんなりと理解できるようになる。
### 検算1の続き — 別の基数でも、同じ式が成り立つことを確かめる
「基数は10でなくてもよい」という主張が本当かどうか、10でも2でもない基数——たとえば5——を使って、実際に確かめておこう。基数を5にした位取り記数法では、使える数字は0・1・2・3・4の5種類だけになる(基数がnであれば、使える数字は0からn−1までのn種類、というのがこの仕組みの一般規則である)。
十進法の `38` を、基数5の位取り記数法で表すとどうなるかを、第二章で扱う「割り続ける方法」を先取りして計算してみる。
```
38 ÷ 5 = 7 あまり 3
7 ÷ 5 = 1 あまり 2
1 ÷ 5 = 0 あまり 1(商が0になったら終了)
あまりを下から上に並べると: 123(基数5表記であることを示すため 123₍₅₎ と書く)
```
検算してみよう。位取り記数法の一般式に基数5を当てはめる。
```
123₍₅₎ = 1×5² + 2×5¹ + 3×5⁰ = 1×25 + 2×5 + 3×1 = 25+10+3 = 38(検算成立)
```
十進法の `38` は、基数5の位取り記数法では `123` と表される。同じ数でも、基数が変われば「見た目の並び」はまったく違うものになるが、`N = dₙ×基数ⁿ + … + d₀×基数⁰` という一般式に当てはめさえすれば、必ず元の値に戻せる。この事実は、基数がいくつであっても——第二章で扱う基数2であっても——変わらない、位取り記数法という仕組みそのものが持つ普遍的な性質である。
### コラム — 位取りを持たない記数法の不便さ、ゼロを持たない記数法の不便さ
位取り記数法のありがたみは、位取りを持たない記数法と比べてみると、いっそうはっきりする。古代ローマで使われていたローマ数字は、`I`(1)・`V`(5)・`X`(10)・`L`(50)・`C`(100)・`D`(500)・`M`(1000)という記号を並べて数を表すが、記号を置く「位置」には、位取り記数法のような一貫した重みの規則がない(`IX` は9、`XI` は11というように、同じ記号でも並び順によって意味の作られ方が変わる、個別の読み替えルールに頼っている)。このため、ローマ数字では `3888` を `MMMDCCCLXXXVIII` のように非常に長い記号列で書く必要があり、大きな数の筆算は極めて煩雑になる。
もう一つの実例として、古代バビロニアでは基数60の位取り記数法が使われていたことが、粘土板の記録から知られている。基数60という大きな基数を採用しながらも、バビロニアの記数法には長い間、ゼロに相当する記号が存在しなかった。そのため「その位に何もない」ことをはっきり示す方法がなく、`61` にあたる表記と `3601`(60×60+1)にあたる表記が、文脈だけで見分けなければならない場面があったと考えられている。位取り記数法という優れた仕組みを持ちながらも、ゼロという記号が伴わなければ、大きな数を誤りなく書き表すことは難しい——この歴史的な実例は、第一章冒頭で触れた「ゼロという発明」の重みを、逆方向からあらためて裏付けている。
### コラム — 記号を書く前に、位取りを「物」で表していた道具: そろばん
位取り記数法という考え方は、紙に文字を書く前から、道具の形で人々の生活の中に存在していたと考えられている。**そろばん(算盤、水準一: 枠の中に串刺しにした玉を、位ごとの列に並べて動かすことで数を表し、計算を行う道具)**は、その代表例である。そろばんの列の一つひとつが、まさに位取り記数法の「一の位」「十の位」「百の位」に対応しており、玉を動かして位ごとの数字を表現し、計算のたびに玉を動かすことで足し算・引き算を進めていく。
そろばんのような、玉や石を使って数を表す道具は、古代の地中海世界や中国など、世界の複数の地域で独自に発展したと考えられている。中国で発展した算盤(そろばん、中国語では「算盤」)は、遅くとも14世紀ごろまでには実用化されていたとする説が広く紹介されている。位取り記数法という「紙の上の抽象的な仕組み」が発明されるよりも前から、「位ごとに玉を置く場所を分ける」という同じ発想が、道具としてすでに実現されていたという事実は、位取りという考え方そのものが、人間にとって直感的で根源的な発想であることを物語っている。この「位ごとに場所を分けて実体化する」という発想は、次章で扱う二進法においても、そして第七章で扱うメモリ番地(位ごとに区切られた記憶の場所)においても、形を変えて繰り返し姿を現すことになる。
### コラム — ゼロという発明の、もう一つの意味
→BOOK-0002第一章で扱われている**ゼロ(0、水準一: 「何もない」という状態そのものを表す数字)**は、5世紀から7世紀ごろのインドの数学者たちによって数として体系化されたと考えられている。位取り記数法の一般式`N = dₙ×基数ⁿ + … + d₁×基数¹ + d₀×基数⁰`という形で見直すと、ゼロの役割がさらにはっきりする。ゼロとは「その位のべき乗の項を、0倍することで実質的に消す」ための記号なのである。この性質は基数が10であろうと2であろうと変わらず、次章で扱う二進法でも、ゼロはまったく同じ役割を果たし続ける。
---
> **定着量の目安(第一章)**: `N = dₙ×基数ⁿ + … + d₀×基数⁰`という位取り記数法の一般式を使い、基数10の数を位ごとに分解して検算する練習を15問程度こなすと、本章の内容はほぼ完全に定着すると見込まれる。特に「位取り記数法は基数を10に固定しなくてよい」という考え方に、自分の言葉で説明できるようになるまで触れておくことが、第二章以降の理解を大きく助ける。
---
## 第二章: 二進法 — たった2つの記号で、あらゆる数を表す(水準一)
### なぜコンピュータは「2」を選んだのか
第一章の最後で確認したとおり、位取り記数法の基数は10でなくてもよい。では、コンピュータの内部ではなぜ基数2が選ばれたのか。その理由は、電子部品の物理的な性質にある(詳しい仕組みは→BOOK-0358b第2部で扱う)。電圧の高い・低い、電流が流れている・流れていない、スイッチが入っている・切れている——電子回路の中では、こうした「2つの状態」を安定して見分けることが、10種類やそれ以上の状態を見分けることよりもはるかに簡単で、誤りが起きにくい。この物理的な単純さと信頼性の高さゆえに、基数を2とする記数法が、現在のほぼすべてのコンピュータで採用されている。
### 二進法の定義
基数を2とし、使う数字を0と1の2種類だけに絞った位取り記数法を、**二進法(にしんほう、水準一: 基数を2とし、0と1の2種類の数字だけで数を表す位取り記数法)**と呼ぶ。第一章の一般式に基数2を当てはめると、次のようになる。
```
二進数 dₙ…d₁d₀ の値 = dₙ × 2ⁿ + … + d₁ × 2¹ + d₀ × 2⁰
(各 d は 0 か 1 のどちらか)
```
二進数であることを明示したいときは、数字の右下に小さく2を添えて `1011₂` のように書く習慣が広く使われている。
### ビットとバイトという単位
二進法の1桁を表す最小単位を、**ビット(bit、水準一: 0か1のどちらかの状態を表す、情報の最小単位)**と呼ぶ。この名前は英語の binary digit(二進の数字)を短く縮めた語で、1バイナリ桁が「情報の一番小さな粒」として扱われることに由来する。
ビットを8個ひとまとめにしたものを、**バイト(byte、水準一: 8ビットをひとまとまりにした情報の単位)**と呼ぶ。8ビットあれば、0と1の組み合わせは `2⁸ = 256` 通り作れるので、1バイトは0から255までの256種類の値を表せる(なぜ2⁸が256になるかは、次の検算2で確かめる)。バイトという単位は、後の章で扱うメモリ番地の基本単位としても、繰り返し登場することになる。
### 検算2 — 二進数を十進数に変換する
`1011₂` という二進数が、十進法でいくつになるかを計算してみよう。位取り記数法の一般式に基数2を当てはめる。
```
1011₂ = 1×2³ + 0×2² + 1×2¹ + 1×2⁰
= 1×8 + 0×4 + 1×2 + 1×1
= 8 + 0 + 2 + 1 = 11(検算成立)
```
`1011₂` は十進法の `11` に等しいことが確かめられた。同じ理屈で `2⁸` を計算すると、`2⁸ = 2×2×2×2×2×2×2×2 = 256` となり、8ビット(1バイト)で表せる値の種類が256通りであることが検算できる。
### 検算3 — 十進数を二進数に変換する(2で割り続ける方法)
逆に、十進数を二進数に変換するには、「2で割り続けて、あまりを記録する」という手順が広く使われている。十進数の `13` を例に、この手順を追ってみよう。
```
13 ÷ 2 = 6 あまり 1
6 ÷ 2 = 3 あまり 0
3 ÷ 2 = 1 あまり 1
1 ÷ 2 = 0 あまり 1(商が0になったら終了)
あまりを、下から上へ(最後に出たものから最初に出たものへ)並べる: 1101
あまりを下から上に読むと1101になり、これが13を二進法で表した値である。
```
検算しておこう。
```
検算: 1101₂ = 1×8 + 1×4 + 0×2 + 1×1 = 8+4+0+1 = 13(検算成立)
```
十進数の `13` は、二進数では `1101` になる。「2で割ってあまりを記録し、下から上に並べる」というこの手順は、機械的に繰り返すだけで答えにたどり着けるという意味で、第一章で扱った筆算(繰り上がりの処理)とよく似た性格を持つ、覚えておくと便利な裏技の一つである。
### 検算3の続き — もう少し大きな数で、同じ手順を繰り返す
手順が本当に「機械的に繰り返すだけ」で通用するかどうかを、もう少し大きな数、十進法の `201` で確かめておこう。
```
201 ÷ 2 = 100 あまり 1
100 ÷ 2 = 50 あまり 0
50 ÷ 2 = 25 あまり 0
25 ÷ 2 = 12 あまり 1
12 ÷ 2 = 6 あまり 0
6 ÷ 2 = 3 あまり 0
3 ÷ 2 = 1 あまり 1
1 ÷ 2 = 0 あまり 1(商が0になったら終了)
あまりを下から上に並べると: 11001001
```
検算しよう。
```
検算: 11001001₂ = 1×128+1×64+0×32+0×16+1×8+0×4+0×2+1×1
= 128+64+0+0+8+0+0+1 = 201(検算成立)
```
桁数が増えても、手順そのものは「2で割ってあまりを記録する」ことの繰り返しにすぎない。この機械的な繰り返しやすさこそが、後の章で見る論理回路が二進法をそのまま採用できる理由の一つでもある——電気回路は「複雑な判断を一度で行う」ことよりも、「単純な判断を高速に繰り返す」ことを得意としているからである。
### 整数だけでなく、小数も二進法で表せる
ここまでは整数(0や正の整数)だけを扱ってきたが、位取り記数法の一般式は、実は小数の位(小数点より右側の位)にもそのまま広げられる。十進法では、小数点より右の位は `10⁻¹`(10分の1の位)・`10⁻²`(100分の1の位)というように、マイナスの指数のべき乗に対応している。同じ考え方を基数2に当てはめれば、二進法の小数点より右の位は `2⁻¹`(2分の1の位)・`2⁻²`(4分の1の位)・`2⁻³`(8分の1の位)に対応することになる。
十進法の `0.75` を二進法の小数に変換してみよう。整数部分を2で「割り続けた」のとは逆に、小数部分は2を「掛け続けて、整数部分が出たらそれを記録する」という手順を使う。
```
0.75 × 2 = 1.5 → 整数部分は1、小数部分0.5を次に使う
0.5 × 2 = 1.0 → 整数部分は1、小数部分0.0になったので終了
整数部分を上から順に並べると: 0.11
```
検算しよう。
```
検算: 0.11₂ = 1×2⁻¹ + 1×2⁻² = 1×0.5 + 1×0.25 = 0.5+0.25 = 0.75(検算成立)
```
十進法の `0.75` は、二進法では `0.11` にぴったり変換できた。ただし、すべての十進小数がこのようにきれいに二進小数へ変換できるわけではない。たとえば十進法の `0.1` は、この掛け続ける手順を繰り返しても、いつまでも0になりきらず、`0.000110011…` のように、ある並びが無限に繰り返される二進小数になってしまうことが知られている(ちょうど、十進法で `1÷3` を計算すると `0.333…` のように無限に続いてしまうのと同じ種類の現象である)。有限の桁数しか記憶できないコンピュータの中では、この無限に続く小数は途中で打ち切られ、ごくわずかな誤差(丸め誤差)を含んだ近似値として記憶されることになる。「0.1を10回足しても、ぴったり1にならないことがある」というコンピュータ特有の現象は、この二進小数の性質に由来しており、小数の記憶方法(浮動小数点数という方式)の詳しい仕組みは→BOOK-0358b以降で扱う。
### コラム — 数字だけでなく文字も0と1で表す: 文字コードという発想
ここまでは「数」を二進法で表す方法を見てきたが、パソコンの中では文字(アルファベットや記号)も、すべて0と1の並びとして記憶されている。ある文字にどの二進数を対応させるかをあらかじめ決めておいた対応表を、**文字コード(もじこーど、水準二: 文字や記号のそれぞれに、あらかじめ決まった数値を割り当てておく対応表)**と呼ぶ。
もっとも基本的な文字コードの一つに、**ASCII(あすきー、水準二: アルファベット・数字・基本的な記号を、0から127までの数値に割り当てた、初期に標準化された文字コード)**がある。ASCIIでは、たとえば大文字の `A` には十進法で `65`(二進法で `01000001`)、小文字の `a` には十進法で `97`(二進法で `01100001`)が割り当てられている。
```
検算: 'A' は65 → 65 = 64+1 = 1×2⁶+0×2⁵+0×2⁴+0×2³+0×2²+0×2¹+1×2⁰ = 01000001₂
'a' は97 → 97 = 64+32+1 = 1×2⁶+1×2⁵+0×2⁴+0×2³+0×2²+0×2¹+1×2⁰ = 01100001₂
```
`A`(65)と `a`(97)の差はちょうど `32` であり、これはアルファベットの大文字と小文字を、二進数のたった1ビットの違い(`01000001` と `01100001` は、上から3桁目のビットだけが違う)で切り替えられるように、ASCIIの対応表があらかじめ工夫して設計されているためである。「文字も結局は数値であり、数値は結局は二進法である」という発見は、パソコンが文章・画像・音声といった、一見まったく性質の異なるデータをすべて同じ仕組みで扱えることの、根本的な理由になっている。
### コラム — 16進法という「人間のための省略記法」
二進数は、桁数が増えるとすぐに読みにくくなる(たとえば `11010110` のような並びを、人間が一目で覚えるのは大変である)。そこで実務では、二進数を4桁ずつ区切って1桁にまとめる**16進法(じゅうろくしんほう、水準二: 基数を16とし、0から9の数字とAからFの6つのアルファベットを使って数を表す位取り記数法)**が、人間にとって読みやすい省略記法として広く使われている。16進法では、10から15までの数字を、それぞれA・B・C・D・E・Fという文字で表す。
二進数4桁は `0000`(0)から `1111`(15)までの16通りを表せるので、16進法の1桁とちょうど一対一に対応する。`11010110₂` を4桁ずつに区切ると `1101` と `0110` になる。
```
1101₂ = 8+4+0+1 = 13 = D(16進法でのAからFの対応: A=10,B=11,C=12,D=13,E=14,F=15)
0110₂ = 0+4+2+0 = 6 = 6
したがって 11010110₂ = D6(16進法)
検算(十進法で確認): 11010110₂ = 128+64+0+16+0+4+2+0 = 214
D6(16進法) = 13×16 + 6 = 208+6 = 214(検算成立)
```
パソコンの中でメモリ番地やエラーコードを16進法で表す場面(第七章で扱う)によく出会うのは、この「二進数4桁=16進数1桁」というきれいな対応関係のおかげで、人間が二進数の内容を素早く読み取れるようにするためである。
### コラム — 二進法の歴史
二進法という考え方そのものは、コンピュータのために発明されたわけではない。ドイツの数学者**ゴットフリート・ライプニッツ(Gottfried Wilhelm Leibniz、1646-1716)**は、1703年に発表した論文「二進算術の説明(Explication de l'Arithmétique Binaire)」の中で、0と1だけを使う記数法を数学的に整理したとされる。ライプニッツは、中国の古典『易経』に登場する陰と陽を組み合わせた図(八卦・六十四卦)にも、0と1の並びに通じる構造を見出していたと伝えられている。さらに時代をさかのぼると、古代インドの学者**ピンガラ(Pingala、紀元前3世紀ごろとされる)**が、詩の韻律(音の長短のパターン)を扱うために、二進法に近い数え方を用いていたという説もある。
この数学的な考え方が、実際に動く機械として初めて具体的な形を取った例の一つが、ドイツの技術者**コンラート・ツーゼ(Konrad Zuse、1910-1995)**が1941年に完成させた **Z3** である。Z3は二進法を採用したプログラム制御式の計算機の初期の実例として知られており、電気機械式のリレー(継電器)という部品を使って、0と1の状態を切り替えていた。「基数を2にする」という数学上のアイデアと、「電気で0と1を安定して切り替える」という物理上の技術が結びついたことで、現在のコンピュータへの道が開かれたのである。
### コラム — 電気で0と1を送る発想は、コンピュータより先にあった: 電信符号の歴史
「電気の状態を0と1(あるいは短い信号と長い信号)に見立てて、情報を送る」という発想そのものは、実はコンピュータの誕生よりも百年近く早く、電信(でんしん)の世界ですでに実用化されていた。19世紀に実用化された**モールス符号(もーるすふごう、水準二: 短い信号〈トン〉と長い信号〈ツー〉の組み合わせで、アルファベットや数字を表す符号)**は、電線を流れる電気を「短く流す・長く流す・流さない」という限られた状態の組み合わせに変換することで、文字を遠方まで送ることを可能にした。二進法そのものではないが(トン・ツー・間隔という3種類の要素を使うため、厳密には二進法とは異なる)、「連続的な情報を、限られた種類の電気信号の組み合わせに変換して送る」という考え方の先駆けとして、二進法や第二章コラムで触れた文字コード(ASCII)の歴史的な背景の一つに数えられている。
### コラム — ビットが集まって「ワード」になる
1バイト(8ビット)よりも大きなまとまりとして、CPUが一度に読み書きする単位を**ワード(word、水準二: CPUが一度の操作でまとめて読み書きする、ビットの固定的なまとまり。大きさは機種によって異なる)**と呼ぶ。よく耳にする「32ビットパソコン」「64ビットパソコン」という表現は、このワードの大きさ(あるいはメモリ番地を指定するための桁数)が32ビットか64ビットかを表している。
ワードが大きいほど、一度に扱える数値の範囲も広がる。第二章の検算2の一般式を使うと、8ビットで表せる値の種類は `2⁸=256` 通りだったが、16ビットでは `2¹⁶=65,536` 通り、32ビットでは `2³²` 通り(この値は第七章の検算14で正確に計算する)にまで広がる。ビット数が1つ増えるごとに、表せる値の種類がちょうど2倍になっていく——これも位取り記数法の「一つ上の位に進むごとに基数倍になる」という性質が、そのまま姿を変えたものである。
### コラム — ワードの大きさが広がってきた、おおまかな歴史
「何ビットのパソコンか」というワードの大きさは、時代とともに広がってきた。年代や機種の詳細には諸説・複数の系統があるため、ここではよく知られる代表的な実例を、あくまで大まかな流れの一例として紹介する。1970年代初頭には4ビットや8ビットのワードを扱う初期のマイクロプロセッサ(演算処理を1つの半導体チップにまとめた部品)が登場し、続く1970年代後半から1980年代にかけて16ビットのワードを扱う機種が広まったとされる。1980年代半ば以降には32ビットのワードを扱う機種が主流になり、2000年代に入ってからは64ビットのワードを扱う機種が広く普及して現在に至っている、というのが一般的に語られる大まかな流れである。ワードが大きくなるごとに、一度に扱える数値の範囲(`2ⁿ`)が指数関数的に広がってきたことが、この流れの数学的な裏付けになっている。半導体チップそのものの構造や製造の歴史は→BOOK-0358b以降・→BOOK-0358i(素材・環境・進化史)で詳しく扱う。
---
> **定着量の目安(第二章)**: 二進数から十進数への変換(検算2の型)を20問程度、十進数から二進数への変換(検算3の型)を20問程度こなすと、水準一〜二の変換操作はほぼ完全に定着すると見込まれる。あわせて、二進数4桁と16進数1桁を相互に読み替える練習を10問程度こなしておくと、後の章でメモリ番地を扱う際の読解が格段に速くなる。
---
## 第三章: 二進数の足し算と2の補数(水準二)
### 二進数の足し算は、十進数の足し算とまったく同じ理屈
第一章で確認した「足し算とは、数え直す手間を省く裏技である」という性質は、基数が2になっても変わらない。二進数1桁の足し算には、次の4通りしかない。
```
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10(1桁では収まらず、繰り上がりが発生する)
```
`1 + 1 = 10₂` は、十進法の `1 + 1 = 2` に対応している。二進法では1と0の2種類の数字しか使えないので、「2」という値は1桁では表せず、一つ上の位への繰り上がりとして扱われる。これは、十進法で `9 + 1 = 10` となり、一の位が0に戻って十の位が繰り上がるのとまったく同じ理屈である。
### 検算4 — 複数桁の二進数を筆算で足し算する
`0101₂`(十進法で5)と `0011₂`(十進法で3)を、十進法の筆算とまったく同じ手順で、右の桁(下位ビット)から順に足し算してみよう。
```
0101 (5)
+ 0011 (3)
------
桁0(一番右): 1 + 1 = 10 → この桁に0を書き、1を繰り上げる
桁1 : 0 + 1 + 繰り上がり1 = 10 → この桁に0を書き、1を繰り上げる
桁2 : 1 + 0 + 繰り上がり1 = 10 → この桁に0を書き、1を繰り上げる
桁3 : 0 + 0 + 繰り上がり1 = 1 → この桁に1を書く
結果: 1000₂
```
0101(5)と0011(3)を筆算すると、結果は1000(8)になる。十進法で検算すると `5 + 3 = 8` であり、`1000₂ = 1×8+0×4+0×2+0×1 = 8` と一致する(検算成立)。基数がいくつであっても、「同じ位同士を足し、桁があふれたら一つ上の位に繰り上げる」という筆算の手順そのものは変わらない、ということがこの検算から確かめられる。
### マイナスの数をどう表すか — 2の補数という工夫
ここまでは0以上の数(正の数)だけを扱ってきたが、実際のコンピュータでは引き算や、負の数を含む計算も行う必要がある。しかし二進法には「マイナス記号」に対応する専用の電気信号があらかじめ用意されているわけではない。そこで広く使われているのが、**2の補数(にのほじょう、水準二: ある正の二進数のすべてのビットを反転させ、さらに1を足すことで得られる、その数の「負の数」を表す表現方法)**という工夫である。
2の補数を作る手順は、次の2段階である。
1. 元になる正の数の各ビットを反転させる(0は1に、1は0に置き換える)。
2. 反転させた値に1を足す。
### 検算5 — 4ビットで「−3」を2の補数で表す
十進法の `3` を4ビットの2進数で表すと `0011` である。この `0011` から、2の補数の手順で `−3` を作ってみよう。
```
3 を4ビットの二進数で表す: 0011
各ビットを反転する(0→1、1→0): 1100
反転した値に1を足すと1100+1=1101になり、これが4ビットの2の補数表現における−3である。
```
この `1101` が本当に「−3」として振る舞うかどうかは、`3 + (−3) = 0` になるはずだという事実を使って検算できる。
```
検算: 0011(3) + 1101(-3として作った値) を4ビットの筆算で足す
0011
+ 1101
------
桁0: 1+1=10 → 0を書き、1繰り上げ
桁1: 1+0+繰り上がり1=10 → 0を書き、1繰り上げ
桁2: 0+1+繰り上がり1=10 → 0を書き、1繰り上げ
桁3: 0+1+繰り上がり1=10 → 0を書き、1繰り上げ
桁4(4ビットの外にあふれた繰り上がり): 1 → 4ビットの器には入りきらないので捨てる
4ビットの範囲に残る結果: 0000(=0)
```
4ビットという決まった大きさの器の中では、5桁目にあふれた繰り上がりは切り捨てられる約束になっている。その約束にしたがうと、`0011(3) + 1101` の結果はちょうど `0000(0)` になり、`1101` が確かに「−3」として振る舞っていることが確かめられた(検算成立)。
### 2の補数で表せる数の範囲
4ビットの2の補数では、最上位のビット(一番左のビット)が0であれば正の数、1であれば負の数を表すという性質がある。4ビットで表せる数の範囲は、最小が `−8`、最大が `7` であり、これを合わせるとちょうど `2⁴ = 16` 通りの状態と一致する(0を含む8個の非負整数〈0〜7〉と、8個の負の整数〈−1〜−8〉で合計16通り)。一般に、`nビットの2の補数`で表せる範囲は `−2ⁿ⁻¹` から `2ⁿ⁻¹−1` までであり、この式は第七章で扱うメモリのアドレス空間の計算にも同じ「2のべき乗」の考え方としてつながっていく。
### 引き算を、足し算と2の補数で行う — →BOOK-0002の「逆再生」の、二進法での姿
→BOOK-0002第二章では、「引き算は足し算を逆から見ただけ」という性質が扱われている。この性質は、2の補数という道具を使うと、二進法の世界でも実にきれいな形で再利用できる。ある数から別の数を引く(`A − B`)代わりに、`B` を2の補数で「負の数」に変換したうえで、`A` にその負の数を足す(`A + (−B)`)——これだけで、専用の「引き算回路」をわざわざ別に用意しなくても、足し算の回路(第五章で組み立てる)だけで引き算まで実現できてしまう。
### 検算6 — 4ビットの範囲で「8 − 3」を、足し算だけで計算する
十進法の `8 − 3` を、4ビットの2の補数を使った足し算に置き換えて計算してみよう。まず `3` の2の補数(−3を表す値)を、検算5と同じ手順で作る。
```
3 を4ビットの二進数で表す: 0011
各ビットを反転する: 1100
1を足す: 1101(これが−3)
```
次に、`8` を4ビットの二進数で表す。
```
8 = 1000(検算: 1×8+0×4+0×2+0×1=8)
```
`8(1000)` と `−3(1101)` を、検算4・検算5と同じ筆算の手順で足し合わせる。
```
1000
+ 1101
------
桁0: 0+1=1
桁1: 0+0+0=0
桁2: 0+1+0=1
桁3: 1+1=10 → 0を書き、1繰り上げ
桁4(4ビットの外へのあふれ): 1 → 4ビットの器の外なので捨てる
4ビットの範囲に残る結果: 0101
```
```
検算: 0101₂ = 4+1 = 5
十進法での確認: 8 − 3 = 5 と一致(検算成立)
```
引き算という専用の演算を新たに用意しなくても、「引く数を2の補数で負の数に変換してから足す」という手順だけで、正しい引き算の結果が得られることが確かめられた。これは第五章で組み立てる足し算の論理回路(半加算器・全加算器)が、実は引き算の役目まで兼ねて果たせることを意味しており、回路の部品数を減らせるという実務上の利点にもつながっている。
### よくある誤解 — 「桁数を増やせば増やすほど安全」ではあるが、決まった桁数の中では限界がある
2の補数には「決まった桁数の中で扱える範囲に上限と下限がある」という制約が常につきまとう。4ビットの2の補数で表せる範囲は `−8` から `7` までだった(第三章)。もし `7 + 1` を4ビットの2の補数で計算するとどうなるか、確かめておこう。
```
0111 (7)
+ 0001 (1)
------
桁0: 1+1=10 → 0を書き、1繰り上げ
桁1: 1+0+繰り上がり1=10 → 0を書き、1繰り上げ
桁2: 1+0+繰り上がり1=10 → 0を書き、1繰り上げ
桁3: 0+0+繰り上がり1=1
結果: 1000
```
`1000` は、4ビットの2の補数のルールでは最上位ビットが1なので負の数として読まれ、実際には `−8` を意味する値になってしまう。`7 + 1` は本来 `8` になるはずだが、4ビットという決まった大きさの器では `8` を正の数として表せる範囲(最大 `7`)を超えてしまい、代わりに `−8` という誤った値が出力されてしまう。この現象を**オーバーフロー(桁あふれ、水準二: 計算結果が、決まった桁数で表せる範囲を超えてしまい、正しくない値になってしまう現象)**と呼ぶ。オーバーフローを防ぐには、あらかじめ十分な大きさのビット数(8ビット・16ビット・32ビットなど)を選んでおくことが欠かせない——これは、次章以降で扱う論理回路やメモリ設計においても、繰り返し意識する必要がある注意点である。
### コラム — なぜ「2の補数」が選ばれたのか: 他の負の数の表し方との比較
負の数を二進法で表す方法は、2の補数だけではない。歴史的には、少なくとも次の3つの方式が使われてきたことが知られている。
1. **符号magnitude方式(符号と絶対値、水準二: 最上位ビットを「符号ビット」〈0なら正、1なら負〉として扱い、残りのビットで絶対値〈大きさ〉をそのまま表す方式)**: たとえば4ビットで `−3` を表すなら、`3` の絶対値 `011` の前に符号ビット `1` を付けて `1011` とする。人間の直感には近いが、`0` を表す組み合わせが `0000`(正の0)と `1000`(負の0)の2通りできてしまうという弱点がある。
2. **1の補数方式(水準二: 正の数のすべてのビットを反転させるだけで負の数を作る方式。2の補数のように1を足す手順がない)**: たとえば4ビットで `3=0011` を反転させると `1100` となり、これがそのまま `−3` を表す。この方式も、`0000`(正の0)と `1111`(負の0)という2通りの0が生まれてしまう弱点を抱えている。
3. **2の補数方式(本章で採用した方式)**: 反転してさらに1を足すという、一手間多い手順を踏む代わりに、`0` を表す組み合わせがただ1通り(`0000`)しか存在しないという、計算上とても扱いやすい性質を持つ。
```
検算: 4ビットで3通りの方式を比べる(3を−3にする場合)
符号magnitude方式: 1011(符号ビット1+絶対値011)
1の補数方式 : 1100(0011を反転しただけ)
2の補数方式 : 1101(0011を反転して1を足す)
```
現在のほとんどのコンピュータで2の補数方式が標準として採用されている最大の理由は、「0がただ1通りしかない」ことに加えて、検算6で確かめたとおり「足し算の回路(第五章の全加算器)をそのまま使うだけで、引き算まで実現できる」という、回路設計上の大きな利点があるためである。符号magnitude方式や1の補数方式では、足し算と引き算とで回路の扱いが複雑になりやすく、計算機の黎明期にはこれらの方式を採用した機種も存在したが、次第に2の補数方式へと収束していったと広く伝えられている。
---
> **定着量の目安(第三章)**: 4桁程度の二進数の筆算による足し算(検算4の型)を25問程度、4ビットまたは8ビットでの2の補数による負の数の作成と検算(検算5の型)を15問程度、2の補数を使った引き算(検算6の型)を10問程度こなすと、水準二の内容はほぼ完全に定着すると見込まれる。特に「あふれた繰り上がりは器の大きさの外では捨てられる」という性質は、後の章で誤った計算(オーバーフロー)を理解するための土台になるため、繰り返し確認しておく価値がある。
---
## 第四章: 論理代数 — AND・OR・NOTという3つの部品(水準二)
### 「正しい・正しくない」を数のように扱う
ここまでの章では、二進数を「0という数字」「1という数字」として扱ってきた。この章では見方を変え、0を「偽(ぎ、成り立たない)」、1を「真(しん、成り立つ)」という、正しいか正しくないかの2つの状態を表す記号として扱う。この見方に立つと、0と1を組み合わせる新しい演算(計算の種類)が見えてくる。この体系を**論理代数(ろんりだいすう、水準二: 真〈1〉・偽〈0〉という2つの値だけを対象に、AND・OR・NOTという演算で組み立てる数学の体系)**と呼ぶ。
この体系は、イギリスの数学者ジョージ・ブール(George Boole、1815-1864)が1847年の著作『論理の数学的分析』、続く1854年の著作『思考の法則』で体系化したとされる。ブールの名前にちなんで、この代数はブール代数(ブールだいすう)とも呼ばれる。
論理代数で使う演算の入力と出力の対応関係を、もれなく一覧にした表を**真理値表(しんりちひょう、水準二: ある論理演算について、考えられるすべての入力の組み合わせと、それに対応する出力をもれなく並べた表)**と呼ぶ。以下、AND・OR・NOTという3つの基本演算を、真理値表と身近なたとえの両方で確認していく。
### AND(論理積) — 両方そろって初めて通る門
**AND(論理積、水準二: 2つの入力がともに1であるときにだけ、結果が1になる演算)**は、記号 `∧` や `・`(あるいは単に並べて書く)で表される。真理値表は次のとおりである。
```
A B | A AND B
0 0 | 0
0 1 | 0
1 0 | 0
1 1 | 1
```
ANDは、「両方の鍵が同時にそろわないと開かない、二重ロックの門」にたとえるとわかりやすい。片方の鍵(入力)だけを持っていても門は開かず(結果は0)、両方の鍵をそろえたときだけ門が開く(結果は1)。
### OR(論理和) — どちらか一方でよい門
**OR(論理和、水準二: 2つの入力のうち、少なくとも一方が1であれば、結果が1になる演算)**は、記号 `∨` や `+` で表される。真理値表は次のとおりである。
```
A B | A OR B
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
```
ORは、「二つある入り口のどちらか片方が開いていれば、中に入れる建物」にたとえるとわかりやすい。両方の入り口が閉まっているときだけ入れず(結果は0)、少なくとも一方が開いていれば入れる(結果は1)。
### NOT(否定) — 反対にひっくり返す壁
**NOT(否定、水準二: 入力が1であれば0を、0であれば1を出力する、入力を反対にひっくり返す演算)**は、記号 `¬` や、入力の上に横線を引く記法(上線)で表される。入力は1つだけである。
```
A | NOT A
0 | 1
1 | 0
```
NOTは、「入ってきたものを必ず反対の状態にして送り出す壁」にたとえるとわかりやすい。
### 検算7 — ANDとORの結果を実際に確かめる
`A=1, B=0` のとき、AND・ORそれぞれの結果を計算してみよう。
```
A AND B = 1 AND 0 = 0(真理値表の3行目と一致・検算成立)
A OR B = 1 OR 0 = 1(真理値表の3行目と一致・検算成立)
```
「両方そろわないと1にならない(AND)」「どちらか一方でも1なら1になる(OR)」という性質が、真理値表どおりに確かめられた。
### XOR(排他的論理和) — AND・OR・NOTの組み合わせで作れる第4の演算
AND・OR・NOTの3つを組み合わせると、新しい演算を作り出せる。その代表例が**XOR(排他的論理和、はいたてきろんりわ、水準二: 2つの入力のうち、どちらか一方だけが1であるときに結果が1になり、両方とも0または両方とも1のときは結果が0になる演算)**である。XORは、次の組み合わせ式で作れる。
```
A XOR B = (A OR B) AND (NOT(A AND B))
```
この式が正しく動くかどうかを、`A=1, B=1` の場合で検算してみよう。
```
A OR B = 1 OR 1 = 1
A AND B = 1 AND 1 = 1
NOT(A AND B) = NOT 1 = 0
(A OR B) AND (NOT(A AND B)) = 1 AND 0 = 0
つまり A XOR B = 0(A=1,B=1のとき)
```
XORの真理値表を直接確認すると、`1,1`の行の結果はやはり `0` であり、組み合わせ式で導いた結果と一致する(検算成立)。
```
A B | A XOR B
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
```
「たった3つの単純な部品(AND・OR・NOT)を組み合わせるだけで、まったく新しい演算(XOR)を作り出せる」——この性質こそが、論理代数がPCの設計の根幹を支えている理由である。次章では、このXORが実際に「足し算」を実現するための部品として使われる様子を見ていく。
### NANDとNOR — ANDとORの「反対」であり、しかも万能な部品
AND・OR・NOTの3つに加えて、実際の電子回路の設計でとりわけ重要な役割を果たす演算に、**NAND(ナンド、否定論理積、水準二: ANDの結果をさらにNOTで反転させた演算。両方の入力がともに1であるときにだけ、結果が0になる)**と**NOR(ノア、否定論理和、水準二: ORの結果をさらにNOTで反転させた演算。両方の入力がともに0であるときにだけ、結果が1になる)**がある。
```
A B | A AND B | A NAND B(ANDの逆)
0 0 | 0 | 1
0 1 | 0 | 1
1 0 | 0 | 1
1 1 | 1 | 0
A B | A OR B | A NOR B(ORの逆)
0 0 | 0 | 1
0 1 | 1 | 0
1 0 | 1 | 0
1 1 | 1 | 0
```
NANDとNORが重要視される理由は、それぞれの部品**単体だけ**を必要な数だけ組み合わせれば、AND・OR・NOTを含む、およそ考えられるすべての論理演算を作り出せるという性質(万能性)を持っているためである。たとえば、NANDの両方の入力に同じ値を入れると、NOTとまったく同じ働きをする。
```
A NAND A = NOT A であることを確かめる(A=1の場合):
1 NAND 1 = 1(両方1なので、AND部分は1、それをNOTで反転して0……ではなく、NAND単体の表を直接見ると)
真理値表より: 1 NAND 1 = 0
NOT 1 = 0
両者は一致する(検算成立)
```
「たった1種類の部品(NANDだけ、あるいはNORだけ)を大量に用意すれば、それだけでどんな論理回路でも組み上げられる」という性質は、実際の半導体チップの製造工程を大きく単純化できるという、実務上とても大きな利点につながっている(具体的な製造の話は→BOOK-0358b以降で扱う)。
### ド・モルガンの法則 — ANDとORを、NOTを介して行き来する橋
AND・OR・NOTの間には、**ド・モルガンの法則(でもるがんのほうそく、水準二: 「AND全体の否定」と「それぞれを否定してからORを取ったもの」が常に等しくなる、という論理代数の法則。ORとANDを入れ替えた形でも同様に成り立つ)**と呼ばれる、次の2つの等式が成り立つ。
```
NOT(A AND B) = (NOT A) OR (NOT B)
NOT(A OR B) = (NOT A) AND (NOT B)
```
この法則が本当に成り立つかどうか、`A=1, B=0` の場合で両辺をそれぞれ計算し、突き合わせて検算してみよう。
```
左辺: NOT(A AND B) = NOT(1 AND 0) = NOT 0 = 1
右辺: (NOT A) OR (NOT B) = (NOT 1) OR (NOT 0) = 0 OR 1 = 1
左辺=1、右辺=1 → 一致する(検算成立)
```
`A=0, B=0` の場合でも確かめておこう。
```
左辺: NOT(A AND B) = NOT(0 AND 0) = NOT 0 = 1
右辺: (NOT A) OR (NOT B) = (NOT 0) OR (NOT 0) = 1 OR 1 = 1
左辺=1、右辺=1 → 一致する(検算成立)
```
ド・モルガンの法則は、「ANDをORに、ORをANDに書き換えたいときは、それぞれの入力にNOTを付け、全体にもNOTを付ければよい」という、変換の橋渡し役を果たす。この法則のおかげで、NANDという1種類の部品だけからORに相当する働きを作り出せる(先ほどのNANDの万能性の裏付けの一つでもある)。
### 応用実践 — 3人のうち2人以上が賛成したら通す「多数決回路」を設計する
ここまで学んだAND・OR・NOTを組み合わせると、実際に役立つ判断の仕組みを自分で設計できる。例として、3人(A・B・C)が賛成(1)か反対(0)かを入力し、「3人のうち2人以上が賛成していれば1を出力する」という**多数決(たすうけつ)回路**を組み立ててみよう。
2人以上の賛成は、「AとBがともに賛成」「BとCがともに賛成」「AとCがともに賛成」という3通りのうち、少なくとも1つが成り立てば実現する。これはAND(両方そろう)とOR(いずれか一つでよい)を、そのまま組み合わせることで表現できる。
```
多数決の結果 = (A AND B) OR (B AND C) OR (A AND C)
```
この式が正しく動くかどうかを、いくつかの入力パターンで検算してみよう。まず `A=1, B=1, C=0`(2人が賛成、1人が反対)の場合。
```
A AND B = 1 AND 1 = 1
B AND C = 1 AND 0 = 0
A AND C = 1 AND 0 = 0
(A AND B) OR (B AND C) OR (A AND C) = 1 OR 0 OR 0 = 1
結果: 1(2人以上が賛成しているので、多数決は「通す」を意味する1になる・期待どおり)
```
続けて `A=1, B=0, C=0`(1人だけが賛成)の場合も確かめておく。
```
A AND B = 1 AND 0 = 0
B AND C = 0 AND 0 = 0
A AND C = 1 AND 0 = 0
(A AND B) OR (B AND C) OR (A AND C) = 0 OR 0 OR 0 = 0
結果: 0(賛成が1人だけでは多数決は成立せず、期待どおり0になる)
```
最後に `A=1, B=1, C=1`(全員が賛成)の場合も確かめる。
```
A AND B = 1、B AND C = 1、A AND C = 1
(A AND B) OR (B AND C) OR (A AND C) = 1 OR 1 OR 1 = 1
結果: 1(全員賛成なのだから当然2人以上の条件も満たし、期待どおり1になる)
```
3通りすべてで、期待した結果と一致した(検算成立)。「AとBがともに賛成」「BとCがともに賛成」「AとCがともに賛成」のうち少なくとも一つが成り立てば全体としても1になる、というOR・ANDの組み合わせが、日常語で言う「多数決」という判断をそのまま論理式として再現できることが確かめられた。このように、AND・OR・NOTという3つの部品だけを組み合わせれば、単純な足し算の回路(第五章)だけでなく、条件判断を行う回路も自由に設計できる——これが論理代数がPCの内部で果たしている、もう一つの大きな役割である。
### 論理代数にも「正式な計算法則」がある
→BOOK-0002第二章以降で扱われている、ふつうの数の計算法則(交換法則・結合法則・分配法則など)と同じように、論理代数にもきちんとした計算法則の一覧がある。「コード関数を正式に組む」ためには、こうした法則を、単なる暗記ではなく、実際に検算して納得しておくことが役に立つ。代表的な法則を、真理値表による検算とあわせて一覧にしておこう。
```
交換法則 : A AND B = B AND A、 A OR B = B OR A
結合法則 : (A AND B) AND C = A AND (B AND C)
分配法則 : A AND (B OR C) = (A AND B) OR (A AND C)
恒等法則 : A AND 1 = A、 A OR 0 = A
支配法則 : A AND 0 = 0、 A OR 1 = 1
補元法則 : A AND (NOT A) = 0、 A OR (NOT A) = 1
冪等法則 : A AND A = A、 A OR A = A
```
このうち、分配法則(第一章・第三章で扱った、ふつうの数の掛け算と足し算の間に成り立つ `a×(b+c)=a×b+a×c` と同じ形をした法則)を、`A=1, B=0, C=1` の場合で検算してみよう。
```
左辺: A AND (B OR C) = 1 AND (0 OR 1) = 1 AND 1 = 1
右辺: (A AND B) OR (A AND C) = (1 AND 0) OR (1 AND 1) = 0 OR 1 = 1
左辺=1、右辺=1 → 一致する(検算成立)
```
補元法則(`A AND (NOT A) = 0`)についても、`A=1` の場合で確かめておく。
```
NOT A = NOT 1 = 0
A AND (NOT A) = 1 AND 0 = 0(検算成立)
```
これらの法則は、ふつうの数の計算法則と見た目がよく似ているが、`A OR 1 = 1`(支配法則)のように、ふつうの数の足し算にはない、論理代数ならではの性質も含まれている(ふつうの数では `a+1` は `a` の値によって変わるが、論理代数の `A OR 1` は `A` の値にかかわらず必ず1になる)。こうした法則を使いこなせるようになると、複雑に見える論理式を、より単純な形に整理し直す(たとえば、より少ない部品数の回路に作り替える)ことができるようになる。この整理の技術は、→BOOK-0358f『関数を正式に組む』で扱う、関数の合成や単純化の考え方にも直接つながっていく。
### コラム — 論理代数と電気回路を結びつけた人物
論理代数は、長い間「純粋に紙の上だけの数学」として扱われてきた。この数学が、実際の電気回路の設計に直接使えることを示したのが、アメリカの技術者クロード・シャノン(Claude Shannon、1916-2001)である。シャノンは1937年、マサチューセッツ工科大学(MIT)に提出した修士論文「継電器と開閉回路の記号的解析(A Symbolic Analysis of Relay and Switching Circuits)」の中で、電気を通す・通さないというスイッチの状態を、ブールの論理代数の1と0にそのまま対応させられることを示したとされる。この発見によって、論理代数という数学の体系と、実際に電気で動く回路とが、初めてはっきりと橋渡しされることになった。この橋渡しの物理的なしくみ(トランジスタや論理ゲートという部品)は、→BOOK-0358b第2部で詳しく扱う。
---
> **定着量の目安(第四章)**: AND・OR・NOTそれぞれの真理値表を、見ずに書けるようになるまで繰り返すこと(目安20問)、およびXORを組み合わせ式から導出して検算する練習を10問程度こなすと、水準二の論理代数の基礎はほぼ完全に定着すると見込まれる。
---
## 第五章: 論理回路を組み合わせる — 半加算器と全加算器(水準二)
### 足し算の物語が、ここで一周する
第一章で「足し算とは何か」から出発し、第三章で「二進数の足し算」を筆算で確かめ、第四章で「AND・OR・NOTという3つの部品」を学んだ。この章では、その3つの部品を組み合わせて、実際に二進数1桁の足し算を行う仕組みを組み立てる。ここが、本部前半の一番の山場である——足し算という最初の話題が、論理の部品を経由して、もう一度「足し算そのもの」に戻ってくるのである。
### 半加算器 — 2つの入力を足し算する部品
2つの1ビットの入力(AとB)を受け取り、その和(足し算の結果)を出力する部品を、**半加算器(はんかさんき、水準二: 2つの1ビットの入力を受け取り、その和〈合計〉を表すSum〈和〉と、桁あふれを表すCarry〈繰り上がり〉の2つを出力する論理回路)**と呼ぶ。半加算器は、第三章で確認した二進数1桁の足し算のルール(`0+0=0`, `0+1=1`, `1+0=1`, `1+1=10`)を、そのまま論理回路として実現したものである。
半加算器の出力は、次の2つの演算で作られる。
```
Sum(和) = A XOR B
Carry(繰り上がり) = A AND B
```
### 検算8 — 半加算器が、第三章の足し算ルールと一致することを確かめる
`A=1, B=1` の場合で、半加算器の出力を計算してみよう。
```
Sum = 1 XOR 1 = 0(XORの真理値表より)
Carry = 1 AND 1 = 1(ANDの真理値表より)
```
Sumが0、Carryが1という結果は、二進数の並びとして読むと「Carry, Sum」の順に `10` となり、第三章の足し算ルール `1+1=10` とぴったり一致する(検算成立)。`A=0, B=1` の場合も確かめておこう。
```
Sum = 0 XOR 1 = 1
Carry = 0 AND 1 = 0
```
「Carry, Sum」は `01`、すなわち `1` であり、これも第三章のルール `0+1=1` と一致する(検算成立)。ANDとXORという2つの論理演算を組み合わせるだけで、二進数の足し算のルールがそのまま再現できることが確かめられた。
### 全加算器 — 繰り上がりを引き継いで、複数桁の足し算をつなげる
半加算器には一つ弱点がある。第三章の検算4のような複数桁の筆算では、下の桁からの繰り上がりも一緒に足し合わせる必要があるが、半加算器は2つの入力(AとB)しか受け取れない。そこで、下の桁からの繰り上がり(Cin、Carry-in)も含めた3つの入力を受け取れるように拡張した部品を、**全加算器(ぜんかさんき、水準二: 2つの1ビットの入力〈A・B〉に加えて、下位桁からの繰り上がり〈Cin〉も受け取り、その和〈Sum〉と、上位桁への繰り上がり〈Cout〉を出力する論理回路)**と呼ぶ。
全加算器は、半加算器を2つとORを1つ組み合わせることで作れる(具体的な組み合わせ方は→BOOK-0358b第2部で回路図として扱う)。全加算器を桁の数だけ横に並べてつなぎ、ある桁のCout(繰り上がり出力)を、隣の桁のCin(繰り上がり入力)につなげていくと、何桁の二進数でも足し算できる回路が組み上がる。これは、第三章の検算4で人間が手作業で行った「右の桁から繰り上がりを一つずつ伝えていく」筆算の手順を、そっくりそのまま論理回路に置き換えたものである。
### 検算8の続き — 2桁の全加算器を鎖のようにつなげてみる
全加算器が「鎖のようにつながる」様子を、実際に2桁の二進数の足し算で確かめてみよう。`01₂`(十進法で1)と `11₂`(十進法で3)を足し算する。桁0(一番右)は最初の桁なので、下位からの繰り上がりCinは `0` を使う全加算器(あるいは半加算器そのもの)を使い、桁1にはその桁0が出したCoutを、桁1のCinとしてそのまま引き継ぐ。
```
桁0の全加算器: A=1, B=1, Cin=0(最初の桁なので繰り上がりなし)
検算9の表(A=1,B=1,Cin=0の行)より: Sum=0, Cout=1
桁1の全加算器: A=0, B=1, Cin=1(桁0のCoutをそのまま引き継ぐ)
検算9の表(A=0,B=1,Cin=1の行)より: Sum=0, Cout=1
結果を上位から並べる: Cout(桁1)=1, Sum(桁1)=0, Sum(桁0)=0 → 100₂
```
検算してみよう。
```
検算: 100₂ = 4
十進法での確認: 1 + 3 = 4 と一致(検算成立)
```
桁0のCoutが、桁1のCinへとそのまま渡され、桁1の全加算器がその繰り上がりまで含めて正しく計算している様子が確かめられた。この「ある桁の出力が、隣の桁の入力にそのままつながる」という鎖のような構造こそが、全加算器を何個も横に並べるだけで、何桁の二進数でも足し算できる理由である。
### 検算9 — 全加算器の真理値表を、すべての組み合わせで確かめる
全加算器は3つの入力(A・B・Cin)を受け取るので、考えられる入力の組み合わせは `2³=8` 通りある。この8通りすべてについて、Sum(和)とCout(繰り上がり出力)を計算し、真理値表を完成させてみよう。全加算器の出力は次の式で作られる(半加算器を2段重ねてORでまとめた構成に相当する)。
```
Sum = A XOR B XOR Cin
Cout = (A AND B) OR (Cin AND (A XOR B))
```
8通りすべてを計算する。XORは「1の個数が奇数のときに結果が1になる」という性質を持つ演算なので、Sumの列は「A・B・Cinのうち1の個数が奇数なら1、偶数(0を含む)なら0」と読み替えて検算できる。
```
A B Cin | 1の個数 | Sum(奇数なら1) | A AND B | Cin AND(A XOR B) | Cout
0 0 0 | 0 | 0 | 0 | 0 | 0
0 0 1 | 1 | 1 | 0 | 0 | 0
0 1 0 | 1 | 1 | 0 | 0 | 0
0 1 1 | 2 | 0 | 0 | 1 | 1
1 0 0 | 1 | 1 | 0 | 0 | 0
1 0 1 | 2 | 0 | 0 | 1 | 1
1 1 0 | 2 | 0 | 1 | 0 | 1
1 1 1 | 3 | 1 | 1 | 0 | 1
```
この表の一番下の行(`A=1, B=1, Cin=1`)を、十進法の足し算で検算してみよう。「1+1+1」は十進法で `3` であり、これを2進数2桁(Cout・Sumの並び)で表すと `11₂` になるはずである。表の結果は `Sum=1, Cout=1` であり、「Cout,Sum」の並びは `11₂ = 2+1 = 3` となって、十進法の `1+1+1=3` とぴったり一致する(検算成立)。念のため、もう一つの行(`A=1,B=1,Cin=0`)も検算しておくと、十進法の `1+1+0=2` に対して、表の `Sum=0, Cout=1` は「Cout,Sum」=`10₂=2` となり、これも一致する(検算成立)。
### コラム — なぜ実機のCPUは、全加算器を単純に並べるだけではないのか
全加算器を桁の数だけ単純に横一列につなげる方式は、**リプルキャリー加算器(りぷるきゃりーかさんき、水準二: 全加算器を桁の数だけ直列につなぎ、繰り上がりを下位桁から上位桁へ順番に伝えていく、もっとも単純な多桁加算回路)**と呼ばれる。この方式は理解しやすく回路も単純だが、桁数が多くなるほど、繰り上がりが最後の桁まで伝わりきるのを待つ時間が長くなるという弱点を持つ。たとえば64桁の二進数を足し算する場合、最悪のケースでは繰り上がりが64個の全加算器を順番に通過し終えるまで、最終的な答えが確定しない。実際のCPUでは、この待ち時間を短縮するために、繰り上がりをあらかじめ先読みして計算する、より複雑な回路(先読み繰り上がり方式など)が使われている。しかし、そうした高速化された回路であっても、根っこにある「AND・OR・XORを組み合わせて、桁ごとの和と繰り上がりを求める」という原理そのものは、本章で確かめた半加算器・全加算器の考え方から変わらない。高速化の工夫はあくまで「同じ答えに、より速くたどり着くための応用」であり、原理の土台は本章で学んだとおりである。
### 掛け算もまた、足し算とシフトの組み合わせにすぎない
→BOOK-0002第二章では、「掛け算は足し算の早業(同じ数を何度も足す作業を一回の計算にまとめたもの)」であることが扱われている。この性質は、二進法の世界でも、これまでに学んだ道具立てだけを使って具体的に再現できる。二進数の掛け算は、**シフト(第六章で詳しく扱う、ビットをずらす操作)と足し算(本章の加算器)の組み合わせ**として実現できる。
十進法の `5 × 3` を、二進数の筆算(シフトと足し算の組み合わせ)で計算してみよう。`5=0101₂`、`3=0011₂` である。掛け算の筆算は、`3` の各桁が1であるところだけ、`5` をその桁の位置までシフトしたものを取り出し、それらをすべて足し合わせるという手順で進む。
```
0101 (5)
× 0011 (3)
------
3の桁0(一番右)が1 → 0101 をシフトせずそのまま取り出す: 0101
3の桁1 が1 → 0101 を左に1ビットシフト: 01010
3の桁2 が0 → 何も足さない(0を足すのと同じ)
3の桁3 が0 → 何も足さない
これらを足し合わせる:
00101
+ 01010
-------
01111
```
結果は `01111₂` である。検算しよう。
```
検算: 01111₂ = 8+4+2+1 = 15
十進法での確認: 5 × 3 = 15 と一致(検算成立)
```
「3の桁1が1だったので、5を左に1ビットシフトした(=5を2倍にした)値を足す」という手順は、まさに位取り記数法の一般式(第一章)そのものである。掛け算という演算を分解すると、結局のところ「シフト(桁をずらして基数倍にする)」と「足し算(第五章の加算器)」という、すでに手に入れた2つの道具の組み合わせにすぎないことが確かめられた。これは→BOOK-0002で扱われた「掛け算は足し算の早業である」という性質が、二進法の世界でも姿形を変えずに成り立ち続けていることの、具体的な証拠になっている。
### 「足し算はどこまでも小さな部品の繰り返しである」という発見
ここまでの流れを振り返ると、次のような一本道が見えてくる。
```
足し算(第一章) → 二進数の筆算(第三章) → AND・OR・NOT・XOR(第四章)
→ 半加算器・全加算器(第五章) → 桁数分つなげた足し算回路
```
パソコンの中で行われている足し算は、指を折って数えるのとは違う道具立て(電気の高い・低い、AND・OR・NOTという判断)を使ってはいるが、根っこにある考え方は、この巻の入口の物語で触れた「小石を3個と4個合わせると7個になる」という、あの単純な足し算とまったく同じものなのである。
---
> **定着量の目安(第五章)**: 半加算器の出力(Sum・Carry)を、第三章の二進数の足し算ルールと突き合わせて検算する練習(検算8の型)を10問程度、全加算器の8通りの真理値表(検算9の型)を自力ですべて埋める練習を3セット程度行うと、水準二の内容はほぼ完全に定着すると見込まれる。
---
## 第六章: ビット演算 — マスクとシフトという裏技(水準二)
### 数値を「ビットの並び」として扱いなおす
前章まででは、二進数を「一つの数値」として足し算する話を扱ってきた。この章では見方を変え、二進数を「複数のビットが横に並んだ一枚のパネル」として扱い、桁ごとにAND・OR・NOT・XORを当てはめる**ビット演算(びっとえんざん、水準二: 数値を複数のビットの並びとみなし、桁ごとに論理演算〈AND・OR・NOT・XOR〉を適用する演算)**を学ぶ。ビット演算は、第四章で学んだ論理代数を、1桁ではなく複数桁いっぺんに適用したものにすぎない。
### マスク — ANDで欲しい桁だけを取り出す
ある値のうち、特定の桁だけを取り出したいとき、その桁だけを1にし、それ以外を0にした値(**マスク〈mask〉、水準二: 特定のビットだけを取り出したり書き換えたりするために使う、あらかじめ用意しておく値**)とANDを取る、という裏技が広く使われている。ANDは「両方が1のときだけ1になる」演算だったので(第四章)、マスク側で0にしておいた桁は、元の値がどうであれ必ず0に落とされ、マスク側で1にしておいた桁だけが、元の値のまま生き残る。
### 検算10 — マスクで下位4ビットだけを取り出す
十進法で `182` にあたる `10110110₂` から、下位4ビット(右側4桁)だけを取り出してみよう。使うマスクは `00001111₂` である。
```
10110110 (182)
AND 00001111 (下位4ビットだけを1にしたマスク)
----------
桁ごとの計算:
1 AND 0 = 0
0 AND 0 = 0
1 AND 0 = 0
1 AND 0 = 0
0 AND 1 = 0
1 AND 1 = 1
1 AND 1 = 1
0 AND 1 = 0
結果: 00000110(十進法で6)
```
この結果を、割り算による検算でも確かめてみよう。8ビットのうち下位4ビットだけを取り出すという操作は、「16で割ったあまりを求める」ことと同じ意味を持つ(なぜなら `2⁴=16` であり、下位4ビットが表せる範囲がちょうど0〜15だからである)。
```
検算: 182 ÷ 16 = 11 あまり 6 → あまりの6が、マスクで取り出した値と一致する(検算成立)
```
このように、欲しい桁だけを1にしたマスクとANDを取ることで、値の一部分だけを安全に取り出せる。この技法は、後の第七章で見るメモリ番地の計算や、色情報(赤・緑・青それぞれの成分)を1つの数値にまとめて保存する場面など、PCの内部で数えきれないほど使われている基本動作である。
### フラグを立てる — ORで特定の桁だけを1にする
マスクとANDが「特定の桁だけを取り出す(それ以外を0にする)」ための道具であるのに対し、**フラグ(flag、水準二: 特定の状態が成立しているかどうかを、1ビットの0/1で表す目印)**を立てる(1にする)ためには、ORが使われる。ORは「どちらか一方が1であれば1になる」演算だったので、元の値のどのビットも変えずに、フラグに対応するビットだけを確実に1にできる。
```
元の値 : 00010000
立てたいフラグ: 00000001
OR演算 : 00010001
検算: 元の値のビット(左から2桁目)はそのまま残り、右端のフラグのビットだけが1になった
```
### 検算11 — 上位4ビットだけを取り出すマスク
検算10では下位4ビットを取り出したが、今度は上位4ビット(左側4桁)だけを取り出してみよう。使う値は検算10と同じ `10110110₂`(十進法で182)、マスクは上位4ビットだけを1にした `11110000₂` である。
```
10110110 (182)
AND 11110000 (上位4ビットだけを1にしたマスク)
----------
桁ごとの計算:
1 AND 1 = 1
0 AND 1 = 0
1 AND 1 = 1
1 AND 1 = 1
0 AND 0 = 0
1 AND 0 = 0
1 AND 0 = 0
0 AND 0 = 0
結果: 10110000(十進法で176)
```
割り算による検算も行っておこう。上位4ビットを取り出すという操作は、「16で割った商(小数点以下切り捨て)に16を掛け直す」ことと同じ意味を持つ。
```
検算: 182 ÷ 16 = 11 あまり 6(商は11) → 11 × 16 = 176 → マスクの結果(176)と一致(検算成立)
```
下位4ビットのマスク(検算10、結果は6)と、上位4ビットのマスク(検算11、結果は176)を足し合わせると、`6 + 176 = 182` となり、元の値にぴったり戻る。1つの値を、マスクによって重ならない部分に分割し、後で足し合わせればまた元に戻せる——この性質は、次章で扱う複数のデータを1つの数値にまとめて記憶する場面で、繰り返し利用される考え方である。
### NOT演算をビット全体に適用する — ビット反転
NOT演算(第四章)を、1ビットだけでなく、値を構成するビットすべてに一斉に適用することを、**ビット反転(びっとはんてん、水準二: 値を構成するすべてのビットに対して、0を1に、1を0に置き換える操作)**と呼ぶ。
```
元の値 : 10110110(182)
ビット反転 : 01001001
検算: 反転後の値を計算すると 01001001₂ = 64+8+1 = 73
182 + 73 = 255 = 2⁸−1(8ビットで表せる最大値)と一致する(検算成立)
```
ある値とそのビット反転を足すと、必ずそのビット数で表せる最大値(8ビットなら `255`)になる、という性質が確かめられた。これは、各桁において「元の値のビットが1ならビット反転側は0、元が0なら反転側は1」となり、各桁の和が必ず1になるためであり、8桁すべてで1が立った状態(`11111111₂=255`)と一致する。この性質は、色の反転(明るい色を暗い色に、暗い色を明るい色に入れ替える)といった画像処理の基本操作としても使われている。
### 循環シフトという変わり種
シフト演算には、はみ出した桁をそのまま捨てるのではなく、反対側に回り込ませる**循環シフト(じゅんかんしふと、ローテート、水準二: ビットを左右にずらす際、はみ出した桁を捨てずに、反対側の端へ回り込ませるシフト演算)**という変種もある。
```
元の値(8ビット) : 10110110
左に1ビット循環シフト : 01101101(左端からはみ出した1が、右端に回り込む)
検算: 元の値の一番左のビット(1)が、シフト後は一番右のビットとして現れている(検算成立)
```
通常のシフト演算(はみ出した桁を捨てる)は「値を2倍・2分の1にする」という数値の意味を保つのに対し、循環シフトは、はみ出した桁を保存したまま並びだけを入れ替えたいとき(暗号処理やデータの並べ替えなど)に使われる、目的の異なる道具である。
### シフト演算 — ビット全体を左右にずらす
ビットの並び全体を、左または右にずらす演算を**シフト演算(しふとえんざん、水準二: 数値を構成するビットの並び全体を、左または右に指定した桁数だけずらす演算)**と呼ぶ。左にずらすことを**左シフト**、右にずらすことを**右シフト**と呼び、それぞれ `<<` `>>` という記号で表されることが多い。
左に1ビットシフトすることは、位取り記数法において「一つ上の位にずれる」ことを意味するので、値を2倍することと同じ意味を持つ(第一章・第二章で確認した「位が一つ上がるごとに、基数倍になる」という性質そのものである)。逆に右に1ビットシフトすることは、値を2で割ること(小数点以下は切り捨て)と同じ意味を持つ。
### 検算12 — 左シフトと右シフトを実際に確かめる
`00000101₂`(十進法で5)を左に1ビットシフトしてみよう。
```
00000101(5)を左に1ビットシフトすると00001010(10)になる。
検算: 5 × 2 = 10(位取り記数法における「一つ上の位にずれる=2倍」という性質と一致・検算成立)
```
続けて `00001010₂`(十進法で10)を右に2ビットシフトしてみよう。
```
00001010(10) を右に1ビットシフト → 00000101(5)
00000101(5) を右に1ビットシフト → 00000010(2、小数点以下切り捨て)
検算: 10 ÷ 4 = 2.5 → 切り捨てて2(2回のシフトはまとめて4で割ることと同じ・検算成立)
```
シフト演算は、掛け算・割り算の回路よりもはるかに単純な回路で実現できるため、2倍・4倍・8倍(あるいはその逆数)といった「2のべき乗倍」の計算を高速に行いたい場面で、現在でも広く活用されている。
### コラム — ビット演算が実際に使われる場面
マスク・フラグ・シフトという3つの技法は、PCの内部で次のような場面に使われている。
- **色情報の合成**: 画面の色を「赤・緑・青それぞれ0〜255の明るさ」として1つの数値にまとめて保存するとき、シフト演算で各色の値を所定の桁位置にずらしてからORで合成し、逆に読み出すときはマスクとANDで各色の値だけを取り出す。
- **権限やオプションの管理**: ファイルの読み取り可・書き込み可・実行可といった複数のオン/オフの状態を、1つの数値の各ビットに割り当てて管理する(ORでフラグを立て、ANDとマスクでフラグを確認する)場面が、オペレーティングシステム(OS)の内部で広く使われている。
- **高速な倍数計算**: 画像や音声のデータ量を2倍・4倍に見積もる場面などで、割り算・掛け算の代わりにシフト演算を使うことで計算を高速化する。
いずれも、この章で学んだAND・OR・シフトという単純な3つの道具の組み合わせにすぎない。
### XORで誤りを見つける — パリティビットという小さな安全装置
第四章で学んだXOR(排他的論理和)は、「1の個数が奇数か偶数か」を調べる演算として、誤り検出という重要な役割にも使われている。複数ビットのデータを送るとき、末尾に1ビットだけ追加の情報(**パリティビット、水準二: データ中の1の個数を偶数〈または奇数〉にそろえるために付け加える、1ビットの検査用の値**)を付けておく方式が広く使われている。
やり方は単純で、データを構成するすべてのビットをXORでつなげていき、その結果をパリティビットとして末尾に付け加える。たとえば `1011` というデータのパリティビットを求めてみよう。
```
1 XOR 0 XOR 1 XOR 1 = ?
1 XOR 0 = 1
1 XOR 1 = 0
0 XOR 1 = 1
パリティビット = 1
送信するデータ: 1011 1(元のデータ+パリティビット)
```
受け取った側は、受け取った5ビットすべてを同じ手順でXORしていき、結果が `0` になれば「1の個数のつじつまが合っている(誤りがない可能性が高い)」、`1` になれば「どこかのビットが化けて1個のビット誤りが起きた可能性が高い」と判断できる。
```
検算: 受け取った1011 1をすべてXORする
1 XOR 0 XOR 1 XOR 1 XOR 1 = (先ほどの計算で1011のXORは1) XOR 1 = 1 XOR 1 = 0
結果が0なので、この5ビットは誤りなく届いたと判断できる(検算成立)
```
もし途中でどこか1ビットだけ化けて `1001 1` のように変化してしまったとすると、5ビットすべてのXORを取った結果は `1` になり、誤りがあったことをすぐに検出できる。パリティビットという、たった1ビットを追加するだけの単純な工夫が、通信や記憶装置における基本的な誤り検出の仕組みとして、現在でも幅広く応用されている(誤りを検出できても、どのビットが誤ったのかまでは特定できず、訂正までは行えない、という限界も正直に述べておく)。
### コラム — バイトの並べ方にも流儀がある: エンディアン
複数バイトにまたがる数値をメモリに記憶する際、上位の桁から先に並べるか、下位の桁から先に並べるかにも、2通りの流儀がある。この並べ方の流儀を**エンディアン(水準二: 複数バイトにまたがる数値を、メモリのどちら向きの番地から並べて記憶するかという流儀)**と呼ぶ。
十進法の `2570`(16進法では `0A0A`……ではなく、わかりやすい例として2バイトの値 `0x1234`、すなわち上位バイト `0x12`・下位バイト `0x34` からなる値)を例に、2つの流儀を比べてみよう。
```
ビッグエンディアン(上位バイトを先頭〈若い番地〉に置く流儀):
番地1000: 0x12(上位バイト)
番地1001: 0x34(下位バイト)
リトルエンディアン(下位バイトを先頭〈若い番地〉に置く流儀):
番地1000: 0x34(下位バイト)
番地1001: 0x12(上位バイト)
```
どちらの流儀が優れているというものではなく、機種や通信規格によってあらかじめ決められた約束事にすぎない。ただし、異なるエンディアンの機器同士でデータをやり取りする際には、バイトの並びを正しく変換しないと、`0x1234` のつもりのデータが `0x3412` という、まったく別の値として読み違えられてしまう。この読み違いを防ぐ変換処理は、ネットワーク通信(→BOOK-0066関連分野)などで実務上欠かせない基本動作の一つになっている。
---
> **定着量の目安(第六章)**: マスクを使ったビットの取り出し(検算10・検算11の型)を15問程度、ビット反転と循環シフトの計算を10問程度、シフト演算による2倍・4倍・8倍の計算(検算12の型)を15問程度、パリティビットの計算とエンディアンの並べ替えを10問程度こなすと、水準二のビット演算はほぼ完全に定着すると見込まれる。
---
## 第七章: 配列の数理 — メモリ番地という巨大な配列(水準二)
### 配列とは何か
同じ種類のデータを、順番に並べて、番号で呼び出せるようにしたものを、**配列(はいれつ、水準二: 同じ種類のデータを順番に並べ、番号〈添字・インデックス〉を指定するだけで、目的のデータを直接取り出せるようにした仕組み)**と呼ぶ。配列の中の位置を指定する番号のことを**添字(そえじ、インデックス、水準二: 配列の中で、何番目のデータかを指定するための番号。多くの体系では0番目から数え始める)**と呼ぶ。
たとえば、5個の得点データを配列として並べたとき、先頭を0番目として数えると、`得点[0]`・`得点[1]`・`得点[2]`・`得点[3]`・`得点[4]` という5つの箱に、それぞれ1つずつデータが収められる。番号(添字)さえわかれば、その箱を直接指定してデータを取り出せる——これが配列という仕組みの一番の利点である。
### メモリを「巨大な配列」として見る
パソコンの中にある記憶装置(メモリ)は、実はこの配列という考え方そのもので作られている。メモリは、1バイト(第二章で定義した8ビットのまとまり)ずつの小さな部屋が、途方もない数だけ一列に並んだ、巨大な配列だとみなせる。それぞれの部屋には、部屋番号にあたる**メモリ番地(めもりばんち、アドレス、水準二: メモリという巨大な配列の中で、各バイトの位置を指定する番号)**が、0番から順番に振られている。
CPU(中央演算処理装置)がメモリの中の特定のデータを読み書きしたいときは、住所を指定するのとまったく同じ要領で、そのメモリ番地を指定する。「配列の添字を指定すればデータが取り出せる」という配列の性質と、「メモリ番地を指定すればそのバイトが読み書きできる」というメモリの性質は、名前が違うだけで、数学的には同じ構造を持っている。
### 検算13 — 配列の要素のアドレスを計算する
先頭アドレスが `1000` 番地から始まり、1個あたり4バイトの大きさを持つデータ(たとえば整数)を並べた配列があるとする。この配列の添字5番目の要素が、メモリ上のどのアドレスに置かれているかを計算してみよう。
配列の要素のアドレスは、次の式で求められる。
```
要素のアドレス = 先頭アドレス + 添字 × 1要素あたりのバイト数
```
1000番地から始まる4バイトごとの配列で、添字5番目の要素のアドレスは1000+5×4=1020番地になる。
```
検算: 添字0番目のアドレス = 1000 + 0×4 = 1000(先頭アドレスと一致)
添字1番目のアドレス = 1000 + 1×4 = 1004
添字2番目のアドレス = 1000 + 2×4 = 1008
添字5番目のアドレス = 1000 + 5×4 = 1020(検算成立)
```
添字が1増えるごとに、アドレスが4バイトずつ規則正しく増えていくことが確かめられる。この「規則正しく並ぶ」という性質のおかげで、CPUは配列の中の任意の要素へ、先頭から順番にたどらなくても、計算一発で直接アクセスできる。
### 二次元の配列も、同じ一本道のメモリに並べられる
配列は、縦横に並んだ表(たとえば画像の縦×横のマス目)のような、二次元の形で扱いたい場面も多い。しかし、実際のメモリは第七章冒頭で確認したとおり、あくまで一本道に並んだ巨大な配列である。二次元の配列を実際に記憶する際は、行(縦)を一列ずつ順番に、一本道のメモリへ並べて格納する方法が広く使われている。この並べ方を**行優先(ぎょうゆうせん、水準二: 二次元配列を一本道のメモリに格納する際、1行分をすべて並べてから次の行に移る格納方式)**と呼ぶ。
幅(横方向のマスの数)が `W` である二次元配列で、`row` 行目・`col` 列目にあるデータのアドレスは、次の式で求められる。
```
要素のアドレス = 先頭アドレス + (row × W + col) × 1要素あたりのバイト数
```
### 検算15 — 画像のようなマス目のアドレスを計算する
幅8マス(`W=8`)の画像データが、先頭アドレス `2000` 番地から、1マスあたり1バイト(明るさの値を0〜255の1バイトで記憶するとする)で並んでいるとしよう。この画像の `row=3行目, col=5列目` にあるマスのアドレスを求めてみよう。
```
要素のアドレス = 2000 + (3 × 8 + 5) × 1
= 2000 + (24 + 5) × 1
= 2000 + 29
= 2029番地
```
検算しておこう。0行目・0列目(先頭のマス)のアドレスが `2000` 番地であることをまず確認し、そこから1行分(8マス)ごとに8バイトずつアドレスが進むという規則性を、別の座標でも確かめる。
```
検算: row=0,col=0 → 2000+(0×8+0)×1=2000(先頭アドレスと一致)
row=1,col=0 → 2000+(1×8+0)×1=2008(1行分=8バイト進んだ)
row=3,col=5 → 2000+(3×8+5)×1=2029(元の計算と一致・検算成立)
```
「二次元のマス目」という、一見するとメモリの「一本道」とは形の違うデータであっても、`row × 幅 + col` という掛け算と足し算の組み合わせ(第一章の位取り記数法とよく似た、「上の位〈行〉×重み+下の位〈列〉」という構造)によって、一本道のアドレスへときちんと変換できることが確かめられた。三次元以上のデータ(立体的な模型や、時間軸を加えた動画データなど)であっても、同じ考え方をもう一段重ねるだけで、同様にアドレスへ変換できる。
### メモリ番地の並びをそろえる: アライメントという配慮
CPUが効率よくメモリを読み書きするために、データの先頭アドレスを、そのデータの大きさの倍数にそろえておくという配慮が広く行われている。この配慮を**アライメント(境界調整、水準二: データの先頭アドレスを、そのデータの大きさの倍数などのきりのよい値にそろえる配慮)**と呼ぶ。たとえば4バイトの整数データは、アドレスが4の倍数(`1000`・`1004`・`1008`…)になる位置に置かれることが望ましいとされる。アドレスが4の倍数からずれた位置(たとえば `1001` 番地)にまたがって4バイトのデータを置いてしまうと、一部のCPUでは複数回に分けて読み書きする必要が生じ、処理が遅くなったり、機種によってはそもそも正しく読み書きできなかったりすることがある。この配慮は、第六章で学んだマスクとシフトを使って、プログラムの内部で自動的に調整されることが多い。
### アドレス空間の大きさを、二進法で見積もる
メモリ番地を指定するために使えるビット数が決まると、その分だけ表せる番地の種類(**アドレス空間〈あどれすくうかん〉、水準二: ある大きさのメモリ番地で表現できる、区別可能な番地の総数**)も自動的に決まる。これは第二章・第三章で確認した「nビットで表せる値の種類は2ⁿ通り」という性質そのものである。
### 検算14 — 32ビットのアドレス空間の大きさを検算する
メモリ番地を32ビットの二進数で表す場合、表せる番地の総数を計算してみよう。
```
2¹⁰ = 1,024(いわゆる「キロ」に近い値)
2²⁰ = 2¹⁰ × 2¹⁰ = 1,024 × 1,024 = 1,048,576(いわゆる「メガ」に近い値)
2³⁰ = 2²⁰ × 2¹⁰ = 1,048,576 × 1,024 = 1,073,741,824(いわゆる「ギガ」に近い値)
2³² = 2³⁰ × 2² = 1,073,741,824 × 4 = 4,294,967,296
検算: 32ビットのアドレス空間は約42億9千万通りの番地を区別でき、
1番地=1バイトとすれば、これはおよそ4ギガバイトの記憶容量に相当する
```
「32ビットのパソコンではおよそ4ギガバイトまでしかメモリを認識できない」とよく言われる根拠は、この `2³²` という計算そのものにある。現在広く使われている64ビットのアドレス空間では、`2⁶⁴` という、32ビットとは比べものにならないほど大きな番地の総数を理論上は表現できる。ただし、これはあくまで「番地として表現できる理論上の上限」であり、実際にパソコンへ搭載されるメモリの量は、これよりはるかに小さい値にとどまるのが通例である(誇大に読まないよう、理論上の上限と実際の搭載量は区別しておく必要がある)。
### アドレスのビット数と、表せる範囲の対応表
ここまでの「`nビットでは2ⁿ通り`」という考え方を、いくつかの代表的なビット数についてまとめて一覧にしておこう。すべて第二章・第三章で確認した「1ビット増えるごとに2倍になる」という規則の、具体的な当てはめにすぎない。
```
8ビット: 2⁸ = 256通り(1バイトで表せる値の種類・第二章検算2の土台)
16ビット: 2¹⁶ = 65,536通り
24ビット: 2²⁴ = 16,777,216通り
32ビット: 2³² = 4,294,967,296通り(検算14で計算済み。約4ギガバイトに相当)
64ビット: 2⁶⁴ = 18,446,744,073,709,551,616通り(日本語の位取りでは約1,845京。理論上の上限であり、実際の搭載量とは別)
```
`8ビットから16ビットへ`(256通り→65,536通り)という増え方だけを見ても、ビット数が2倍になっただけで表せる値の種類が256倍(`65,536÷256=256`)にも跳ね上がっていることがわかる。位取り記数法の「桁が1つ増えるごとに基数倍になる」(第一章)という性質が、ビット数の場合には「桁が8つ増えるごとに256倍になる」という、指数的な増え方として姿を現している。
### 命令もデータも、同じ一本の配列の中に並ぶ
ここまで見てきたように、メモリは「番地という添字を使って、1バイトずつのデータを直接取り出せる、巨大な配列」である。この配列には、数値や文字といった「データ」だけでなく、CPUが実行する「命令」そのものまでもが、区別なく同じ番地空間の中に並べて記憶される。命令もデータも同じ記憶装置の中に置き、同じ仕組みで読み書きするという、この考え方を**ストアドプログラム方式(蓄積プログラム方式、水準二: 実行する命令とその対象となるデータを、区別なく同じメモリ〈番地で指定できる配列〉の中に格納しておく設計方式)**と呼ぶ。
この考え方は、アメリカの数学者ジョン・フォン・ノイマン(John von Neumann、1903-1957)が1945年の報告書「EDVACに関する報告書第一稿(First Draft of a Report on the EDVAC)」の中で示したとされる。この設計方式にちなんで、命令とデータを同じメモリ空間に格納する構造は、しばしば「ノイマン型」と呼ばれる。実行中のプログラムを書き換えたり、プログラム自身が別のプログラムのデータを読み書きしたりできるのも、この「命令とデータが同じ一本の配列に並んでいる」という性質があるからこそ実現できることである。
### 本部のまとめとしての一本道
ここまでの7つの章を、あらためて一つの流れとして振り返ってみよう。
```
足し算(第一章) → 位取り記数法の一般化(第一章)
→ 基数を2にした二進法(第二章) → 二進数の筆算による足し算(第三章)
→ AND・OR・NOT・XORという論理代数(第四章)
→ 半加算器・全加算器という、論理で組み立てた足し算回路(第五章)
→ マスク・フラグ・シフトというビット演算(第六章)
→ 配列とメモリ番地、ストアドプログラム方式(第七章)
```
足し算という、誰もが最初に習う計算から出発し、その足し算を支える位取りという仕組みを2進法へ広げ、論理代数という3つの単純な判断の道具で足し算そのものを組み立て直し、最後にメモリという巨大な配列の中に、命令もデータも並んでいることを確かめた。この一本道こそが、次部(第2部『電子と部品の物理』)以降でトランジスタや論理ゲートという実際の部品を学ぶための、確かな土台になる。
---
> **定着量の目安(第七章)**: 一次元配列の添字からアドレスを計算する練習(検算13の型)を15問程度、二次元配列の`row×幅+col`からアドレスを計算する練習(検算15の型)を10問程度、nビットのアドレス空間の大きさを`2ⁿ`で見積もる練習(検算14の型)を10問程度こなすと、水準二の配列の数理はほぼ完全に定着すると見込まれる。
---
## 三つの実践解(§16.21) — 紙とペン、そして手元の電卓でできる実践
理論と計算を、実際に手を動かして確かめる方法を三つ紹介する。いずれも特別な部品や工具を必要とせず、紙とペン、あるいは手元にある一般的な電卓やパソコンの標準機能だけで完結する、安全な実践解である。
1. **十進↔二進の手計算往復実践**: 自分の誕生日の日にち(1〜31までの数)や、好きな数を1つ選び、検算3の「2で割り続ける」手順で二進数に変換し、その結果を検算2の「位ごとに掛けて足す」手順で元の十進数に戻す。行きと帰りで同じ数字に戻れば、手計算が正しかったことの裏付けになる。この往復を10個程度の数で繰り返すと、位取り記数法という考え方が体に染み込みやすい。
2. **真理値表の自作実践**: 第四章・第五章で扱ったAND・OR・NOT・XORについて、真理値表を見ずに、まっさらな紙に自分の手で書き出してみる。さらに、`(A AND B) OR (NOT C)` のような、3つの入力を含む少し複雑な組み合わせ式を1つ自分で作り、その真理値表(入力の組み合わせは2³=8通り)をすべて手計算で埋めてみる。8通りをすべて自力で埋め切れれば、論理代数の基本操作が身についた目安になる。
3. **電卓の「進数変換」機能を使った実測照合実践**: 多くのパソコンには、標準の電卓アプリに「プログラマーモード」のような、10進・2進・16進を相互に変換して表示する機能が用意されている(具体的な操作手順は各パソコンの説明書を参照)。第二章・第六章で手計算した二進数・16進数の変換結果を、この電卓機能に入力して照らし合わせ、自分の手計算と機械の表示が一致するかどうかを確かめる。一致すれば手計算の正しさの裏付けになり、ずれていれば、どの桁で計算を間違えたかを探す良い練習になる。
---
## まとめ — 足し算という一本の糸が、PCの中身まで届いている
本部では、「3+4=7」という誰もが知っている足し算を出発点に、位取り記数法という仕組みを二進法へ広げ(第一章・第二章)、二進数の筆算による足し算と、負の数を表すための2の補数を学び(第三章)、AND・OR・NOTという3つの単純な判断の道具で論理代数を組み立て(第四章)、その論理代数を使って足し算そのものを回路として作り直し(第五章)、マスク・フラグ・シフトというビット演算の実務的な技法を身につけ(第六章)、最後にメモリという巨大な配列と、命令もデータも同じ番地空間に並ぶストアドプログラム方式までをたどってきた(第七章)。
「足し算から」というこの巻の出発点は、単なる比喩ではない。第五章で確かめたとおり、実際にパソコンの中で行われている足し算は、AND・OR・XORという論理演算を組み合わせた回路によって、電気の高い・低いという2つの状態だけで実現されている。子供のころに覚えた足し算の理屈が、姿を変えながらも、パソコンの内部でそのまま生き続けている——この一本の糸をたどれたことが、本部の一番の到達点である。
ここまでの内容は、あくまで数値と論理という抽象的な土台である。この土台の上に、実際にトランジスタや論理ゲートという電子部品を積み上げ、その部品がどのような物理法則(電圧・電流・抵抗、半導体)で動いているのかを学ぶのが、次部(第2部『電子と部品の物理』)の仕事になる。足し算から出発したこの旅は、この先も一歩ずつ、部品を選び、組み立て、実際に動くパソコンを作れる場所まで、着実に歩みを進めていく。
---
## 章末: 簡易回路図とまとめの階段図
まず、第五章で組み立てた半加算器を、ASCII図で表してみよう。
```
A ──┬──[XOR]── Sum(和)
│ │
B ──┼────┘
│
└──[AND]── Carry(繰り上がり)
関係式: Sum = A XOR B、Carry = A AND B
検算(A=1,B=1): Sum=1 XOR 1=0、Carry=1 AND 1=1 → 「Carry,Sum」=10(十進法の2に相当)
```
続いて、本部全体の歩みを階段図としてまとめる。
```
[水準二] 配列の数理・メモリ番地
添字5番目のアドレス=1000+5×4=1020番地(検算13)
32ビットのアドレス空間=2³²=4,294,967,296通り(検算14)
▲
│ 番地という添字で、巨大な配列を読み書きする
[水準二] ビット演算(マスク・フラグ・シフト)
182 AND 00001111 = 6(検算10)、5<<1=10(検算12)
▲
│ 論理演算を、複数桁いっぺんに適用する
[水準二] 半加算器・全加算器
Sum=A XOR B、Carry=A AND B(検算8)、全加算器8通り検算(検算9)
▲
│ 論理の部品で、足し算そのものを組み立て直す
[水準二] 論理代数(AND・OR・NOT・XOR・NAND・NOR)
1 AND 0=0、1 OR 0=1(検算7)、ド・モルガンの法則を検算
▲
│ 0と1を「真・偽」として扱いなおす
[水準二] 二進数の足し算と2の補数
0101+0011=1000(検算4)、3の2の補数=1101(検算5)、8-3=5(検算6)
▲
│ 同じ筆算の理屈を、基数2に当てはめる
[水準一] 二進法(基数2の位取り記数法)
1011₂=8+0+2+1=11(検算2)、13=1101₂(検算3)
▲
│ 位取り記数法の基数を、10から2に変える
[水準一] 足し算と位取り記数法の一般化
4185=4×10³+1×10²+8×10¹+5×10⁰(検算1)
横の広がり:
[水準一] 十六進法(二進数4桁=十六進数1桁という省略記法)
[水準二] OR・NOT ←(AND と並ぶ3つの基本演算)→ AND
[水準二] マスク(ANDで取り出す) ←(対をなす)→ フラグを立てる(ORで書き込む)
現在のフロンティア(第四章コラム・第七章):
1937年 クロード・シャノンが論理代数と電気回路の対応を示す(MIT修士論文)
1945年 ジョン・フォン・ノイマンがストアドプログラム方式を報告書で示す
※本部で扱った論理代数・二進法・配列の考え方は、現在のほぼすべてのコンピュータの設計に、
形を変えながら今なお使われ続けている(未解決の謎ではなく、現役の設計原理という意味でのフロンティア)。
次の部(PC創造大全 第2部): BOOK-0358b(水準二〜四・電子と部品の物理
─電子・電圧電流抵抗→半導体→トランジスタ→ゲート→受動部品→基板PCBの読み方) ─────▶
```
---
## 参照文献(定番教科書・一般規格・原著)
1. 基礎的な計算機科学・情報科学の標準的教科書群(大学初年次向けに広く使われている、数の表現〈二進法・補数表現〉、論理回路、コンピュータアーキテクチャの基礎を扱う定番の入門教科書群)。
2. ゴットフリート・ライプニッツの二進算術に関する論文: Leibniz, G. W. *Explication de l'Arithmétique Binaire*, 1703年発表(『二進算術の説明』)。
3. ジョージ・ブールの原著: Boole, G. *The Mathematical Analysis of Logic*, 1847年刊、および *An Investigation of the Laws of Thought*, 1854年刊。
4. クロード・シャノンの修士論文: Shannon, C. E. *A Symbolic Analysis of Relay and Switching Circuits*, マサチューセッツ工科大学、1937年。
5. ジョン・フォン・ノイマンの報告書: von Neumann, J. *First Draft of a Report on the EDVAC*, 1945年(モーア・スクール電気工学校〈ペンシルベニア大学〉刊行の草稿)。
6. コンラート・ツーゼによるZ3(1941年完成)に関する、計算機史の定番文献群(電気機械式リレーによる二進法計算機の初期の実例として広く扱われる)。
---
(本冊子は現代学問宇宙図鑑シリーズ BOOK-0358a。応用の軌道ステーション群・工学分野・統合大型巻『PC創造大全』(BOOK-0358・全22部+総論)の第1部(数と論理の土台)。次部BOOK-0358b(電子と部品の物理・水準二〜四)では、電子・電圧電流抵抗から半導体・トランジスタ・論理ゲートまでを扱い、本部で学んだ論理代数〈AND・OR・NOT〉が実際の電子部品としてどう作られるかを橋渡しする予定。CATALOG_PC創造大全.md・GAKUMON_UNIVERSE.md 進捗台帳を参照。)
# BOOK-0358a PC創造大全 第1部: 数と論理の土台 — 足し算から、PCの中身を読むための最初の言葉へ