1. パソコンの 中では、数が どう なって いるの?
1. 数は、電気の「高い・低い」で書かれている
1. 電圧の2状態を、0と1とみなす
パソコンの 中では、どんな 数も、0と 1だけで あらわされます。0と 1だけの 数の 書き方を、2しん数と いいます。
電気の 強さ(でんあつ)が 高い ときを 1、ひくい ときを 0と きめて います[1]。ちょうど、電気の スイッチが 入か 切かの 2つしか ない ような ものです。
2しん数では、1の 次が 10に なります。これは「イチ・ゼロ」と 読み、数の 2の ことです。9の 次で 10に なる ふだんの 数と、にた きまりです。
ただし ほんとうは、パソコンは 電気の 強さを 見て、高いか ひくいかを 見分けて います。さて、この 0と 1だけで、どう たし算を するのでしょう。
パソコンの中の数は、電気の電圧の「高い・低い」で書かれています。電源電圧になっている状態を1、GND(0ボルト)になっている状態を0と決めると、2つの状態だけで数を表せます。コンピュータ内部の計算は、この1と0の2進数が基本です[1]。
2進数も、桁が上がるときの考え方は10進数と同じです。10進数は9の次で桁が上がって10になります。2進数は1の次で桁が上がるので、2は「10」、3は「11」、4は「100」と書きます。
この「1の次は10」が、このあと足し算の回路で大事な役をします。では、0と1だけの世界で、足し算はどのように作るのでしょうか。
資料によれば、コンピュータ内部の演算は1と0の2値で行われ、2進数が基本になる。電源電圧(Vdd、ブイディーディー)の状態を1、GND(グランド、0V)の状態を0とする[1]。数は電圧の高低の並びとして持たれ、計算も電圧の高低を入力して高低を出力する回路になる。
2進数の位取りは10進数と同じ規則だ。10進数では9の次で桁が上がるが、2進数では1の次で桁が上がる。つまり2=10、3=11、4=100となる。この「1+1で桁が上がる」性質が、加算器の設計の出発点になる。電圧の高低を0と1に読み分けるため、部品はスイッチのように入と切を切りかえる働きで説明できる。
では、2つの状態しか持たない回路で、桁上がりを含む足し算をどう組み立てるのか。
2. 1+1は、どうして 10に なるの?
2. スイッチを組み合わせると、1+1=10が作れる
2. 論理ゲートで、1ビットの足し算を作る
2しん数の たし算は、4つしか ありません。0+0=0、0+1=1、1+0=1、そして 1+1=10です[1]。
この 4つを 電気の 回路で 作ります。ためしに、スイッチと 豆電球を 思いうかべて ください。2つの スイッチを 1本の 線に つなぐと、りょうほうの スイッチが 入った ときだけ 電球が つきます。これが「AND(アンド)」です[1]。
1+1=10の「10」のうち、上の けたの 1は、りょうほうが 1の ときだけ 出ます。つまり、ANDの 答えが、そのまま 上の けたへ のぼる 数に なります。
ほんものの パソコンでは、スイッチの やくめを、とても 小さな 部品が します。たし算の 回路は、そんな 部品を 組み合わせて できて います。
2進数の足し算は、0+0=0、0+1=1、1+0=1、1+1=10の4通りだけです。1+1だけは桁が上がって「10」になります[1]。
豆電球とスイッチで考える
この4通りを回路にするとき、使われるのがAND・OR・NOTといった論理回路です。スイッチ(ON=1)と電球(光る=1)にたとえると分かりやすくなります。ANDは、2つの入力が両方1のときだけ出力が1になります。ORは、どちらかが1なら出力が1です[1]。NOT・AND・ORがあれば、あらゆる論理が表せます。
1+1=10の上の桁の1は、「両方が1のときだけ1」なので、ANDの出力そのものです。下の桁の0は、「ちがうときだけ1」になるXOR(エックスオア)の出力です。この2つを並べた回路を、半加算器といいます[2]。
スイッチの回路に、論理を結びつけた人
スイッチの回路と論理を結びつけたのは、アメリカのクロード・シャノンだといわれます。1937年、MITに出した修士論文で、スイッチ回路の並びを論理の式で整理できると示しました[7]。この考え方は、論理で回路を設計する出発点のひとつとされます。
ところで、半加算器は下の桁からの桁上がりを受け取れません。長い数の足し算には、どうするのでしょうか。
2進数の加算は、0+0=0、0+1=1、1+0=1、1+1=10(桁上がり)の4通りに尽きる。これをLSIの中で実行するために論理回路を使う[1]。ANDは両入力が1のときだけ出力が1、ORはどちらかが1なら1で、スイッチと電球の回路で説明される。NOT・AND・ORの組み合わせですべての論理が表せる[1]。
2つの1ビットa、bを足すとき、上の桁へ送る繰り上がりcはc=a·b(AND)、和sはs=a⊕b(XOR、エックスオア、排他的論理和)で書ける。この回路を半加算器(はんかさんき)という[2]。1+1で和が0・繰り上がりが1になることは、この2式から直接読み取れる。
この論理とスイッチ回路の対応を理論として示したのが、シャノンが1937年にMITへ提出した修士論文だとされる。資料の中には「今世紀もっとも重要で有名な修士論文だろう」というガードナーの評(1987年)もある。ただし、この点は二次資料による[7]。
半加算器には限界がある。下の桁から来る繰り上がりの入力がないので、2桁以上の足し算ではそのままでは使えない。
3. 長い 数の たし算は、どう するの?
3. 桁上がりをリレーして、長い数を足す
3. 全加算器とリップルキャリー ── 桁上がりを順に待つ遅れ
2けたいじょうの たし算では、下の けたから 上げて きた 数も 足さなければ なりません。それを 受けとる 回路を「ぜんかさんき」と いいます。1+1+1=11まで 計算できます[2]。
この 回路を けたの 数だけ ならべて、下から 上へ、くり上がりを 手わたして いきます[2]。バケツリレーに にて います。
ただし バケツリレーには 弱点も あります。上の けたは、下の けたの 答えを 待たないと 動けません。そこで、くり上がりを 先に 読んで、はやく する くふうも あります[2]。
半加算器の弱点を補うのが、全加算器です。下の桁からの繰り上がり(carry in)も受け取って、1+1+1=11のところまで計算できます[2]。
これを桁数ぶん並べ、下の桁の繰り上がりを、上の桁へ順に渡していきます。この方式をリップルキャリー加算器といいます[2]。筆算で、一の位から順に繰り上がりを書いていく様子と同じです。
順番待ちを、どう減らすか
ただし、この方式には弱点があります。上の桁は、下の桁の繰り上がりが決まるまで待たなければならないので、桁数が増えるほど計算が遅くなりやすくなります。これを速くするために、繰り上がりを先読みする桁上げ先見加算器という方式が考えられています[2]。細かい遅れの大きさは、方式や回路の作り方によって変わります。
足し算の土台は、これで見えてきました。では、ここから引き算は、どう生まれるのでしょうか。
全加算器は、2つのビットに加えて下の桁からの繰り上がり(carry in)を受け取り、和と上への繰り上がりを出す。1+1+1=11まで扱えるので、2桁以上の加算の部品になる[2]。
桁数ぶんの全加算器を並べ、繰り上がりを下から上へ順に渡す構成をリップルキャリー加算器(RCA)という。部品が単純で、同じ回路を繰り返すだけで作れる利点がある。一方で、上の桁は下の桁の繰り上がりを待つため、桁数が増えるほど、繰り上がりを待つ遅れも大きくなりやすい。そこで繰り上がりを並列に先読みして速くするのが、桁上げ先見加算器(CLA)だ[2]。遅れの細かい大きさは、回路の作り方で変わる。
こうして足し算は、同じ部品の繰り返しで任意の桁数に伸ばせる。では、この足し算の回路を、引き算にどう使い回すのか。
4. ひき算は、たし算に 化けるの?
4. 引き算を、足し算の式に書き直す
4. 補数を使い、引き算 x − y を足し算 x + ~y + 1 に書き直す
5-2を、4けたしか ない メーターで 考えましょう。いまの 数が 0005だと します。「-2」は、0000より 2つ 前なので、9998と みなします。
5+9998=10003。いちばん 上の 1は、けたが たりないので すてます。のこった 0003、つまり 3が 答えです。
走る 長さを はかる メーターが 0000の 次に 9999へ もどる 様子に にて います。ただし 本当は、10しん数の ものがたりです。パソコンの 中では、2しん数で、同じ ことを して います。
こうして ひき算も、たし算の 回路で 計算できます[3]。ひき算の ためだけの 回路を べつに 作らなくても すむ ことが 多いのです。
引き算の秘密は、「−2」を、足し算で扱える数に置きかえることです。そこで、すべてのビットが1の状態を、−1とみなします。4桁なら1111が−1、1110が−2です[4]。
5−2を4桁の足し算にする
5は0101、−2は1110です。0101+1110=10011となります。桁が足りないので、いちばん上の1は捨てます。残った0011は3です。5−2の答えが、足し算だけで出ました[4]。
この置きかえは、使う桁数を決めているときに成り立ちます。この例では4桁です。
引き算専用の回路が要らないわけ
式にすると、x − y = x + (−1 − y) + 1 と書けます。(−1 − y)は、yのすべてのビットを反転すれば得られます。そのため、足し算はs=x+y+0、引き算はs=x+~y+1と、ほとんど同じ形になり、多くの整数演算回路では引き算専用の回路を別に作らなくて済みます[3]。
引き算が足し算に化けるなら、かけ算はどう作られているのでしょうか。
引き算が足し算の回路で済む理由は、式の変形にある。x − y = x + (−1 − y) + 1 と書き直せ、(−1 − y)はyの全ビットを反転すれば得られる。したがって、足し算はs=x+y+0、引き算はs=x+~y+1と同じ形になり、足し算の回路に入れる値を変えるだけで引き算が行える[3]。
この変形が成り立つ前提は、有限のビット数にある。ビットがすべて1の状態を−1とみなす約束にすると、4桁では1111が−1、1110が−2になる[4]。例として5−2を、0101+1110=10011で計算できる。あふれた最上位の1を捨て、残る4桁0011(=3)が答えとなる[4]。x+~y+1の形で確かめても、0101+1101+1=10011で同じになる。
桁数が決まっているからこそ、あふれた桁を捨てる操作が答えを変えない。つまり、この方式は「ビット数を固定した機械」の約束事に依存している。10進数の4桁メーターで、5−2を5+9998=10003と考え、あふれた1を捨てて3を得るのと、同じ考え方である。では、かけ算の回路は、足し算の上にどう積まれるのか。
5. かけ算も、たし算で できるの?
5. かけ算は、2進数の筆算と同じ
5. 乗算 ── 1011×110をずらして足す
2しん数の かけ算は、ふだんの ひっ算と おなじ やり方です。かける 数の けたごとに、かけられる 数を 書いて、1つずつ 左へ ずらして たします[5]。
2しん数では、かける 数の けたは 0か 1。1なら そのまま うつし、0なら 0を 書くだけです。むずかしい 九九は いりません。
たとえば 1011×110。110の いちばん 右は 0なので 0、その 左は 1なので 1011、さらに 左も 1なので 1011を もう 1つ 左へ ずらして。足すと 1000010、10しん数で 66です。11×6=66と 同じに なりました。
かけ算も、うつして ずらして 足す、たし算の くりかえしで できます。
2進数のかけ算は、10進数の筆算と同じ要領です。かけられる数に、かける数の各桁をかけたものを、1段ずつ左にずらして足し合わせます[5]。
2進数では、各桁が0か1しかありません。そのため、各段は「そのまま写す」か「全部0にする」のどちらかです。10進数の筆算で大変な九九の部分が、ほとんど要りません。
1011×110を計算してみる
1011は10進数で11、110は6です。110の下の位から順に見ると、いちばん下は0なので、この段は0です。次の位は1なので、1011を左に1つずらした10110を書きます。その次も1なので、1011を左に2つずらした101100を書きます。
この3段を足すと、10110+101100=1000010になります。10進数にすると64+2で66です。11×6=66と一致します。
10110が22(11の2倍)、101100が44(11の4倍)になっている点にも注目です。ここから、数を2進数で左に1つずらすと、2倍になることが確かめられます。かけ算は、ずらして足す、足し算の組み合わせです。
ここまでで、足し算の回路が土台になる様子がそろいました。では、これらの計算は、1秒間にどれほど行われているのでしょうか。
2進数の乗算は、10進数の筆算と同じ手順になる。被乗数に乗数の各桁をかけたものを、1段ずつ左にずらして足し合わせる[5]。各桁は0か1なので、各段は被乗数をそのまま写すか、0にするかのどちらかで、実際に計算が必要なのはずらした値の加算だけだ。
例として1011×110を計算する。1011は11、110は6である。乗数の下位から、1ビット目は0なので0、2ビット目は1なので1011を1つ左にずらした10110、3ビット目も1なので2つ左にずらした101100を書く。10110+101100=1000010、これは64+2=66で、11×6と一致する。
10110が11の2倍の22、101100が4倍の44になっていることから、2進数で左に1つずらすことは2倍することと対応する。10進数で左にずらすと10倍になるのと同じ構造だ。乗算が加算の繰り返しとずらしの組み合わせになるのは、このためだ。
つまり、加算・減算・乗算が、加算器を土台にした設計でつながる。では、その土台の回路は、時間あたりでどのくらいの速さで動くのか。
6. パソコンは、1びょうに 何回 計算できるの?
6. 計算のテンポは、1秒に数十億回
6. クロック周波数 ── 3.6GHzが意味するもの
パソコンの 中には、とても はやい 時計のような 「テンポ」が あります。これを クロックと いいます。1びょうに 何回 うごくかを あらわします[6]。
3.6ギガヘルツの パソコンは、1びょうに 36おく回の テンポで 動きます[6]。たし算に 1びょう かかる 人が 36おく回 やると、100年 いじょう かかる 長さです。
ただし 本当は、テンポ1回が たし算1回とは かぎりません。かかる 回数は、パソコンの しゅるいで ちがいます。
7. 紙と えんぴつで、じぶんで 計算して みよう
7. 紙と鉛筆で、2進数の計算を確かめる
7. 紙の上で検算する ── 資料を読みたくなったら
パソコンの 中の 計算は、紙と えんぴつでも、できます。4けたで 計算します。まず、5-2を やって みましょう。5は 0101、-2は 1110です。たして、いちばん 上の 1を すてると、3に なります。
つぎは かけ算です。1011×110を、ひっ算の ように 左へ ずらして たして みましょう。66に なれば、せいこうです。10しん数の 11×6と くらべて みても いいでしょう。
やって みて、ほかの 数でも 同じ ことが 起こるか、自分で 数を かえて たしかめて みましょう。
しらべた もとの じょうほう
参考にした情報源
参考にした情報源と、その使い方
本文で使った資料です。
- 立命館大学 藤野毅「LSI概論(3)論理回路と論理ゲート」 https://www.ritsumei.ac.jp/se/re/fujinolab/FujinolabHP_old/IntroLSI/IntroLSI-3.pdf (電圧と0・1、2進数の足し算、論理回路)
- 法政大学 山下ほか「論理回路入門(6)加算器」 https://yamin.cis.k.hosei.ac.jp/lectures/logic/06-adders.pdf (半加算器・全加算器・リップルキャリー)
- ウィキブックス「高等学校情報/負数と小数のデジタル表現」 ウィキブックス(負数と小数のデジタル表現) (4桁での5−2の例)
- MONOist「電子回路基礎講座 第3回」 https://monoist.itmedia.co.jp/mn/articles/0801/31/news127.html (2進数のかけ算の手順)
- Corsair「CPUクロック速度とは」 https://www.corsair.com/jp/ja/explorer/gamer/gaming-pcs/cpu-clock-speed-explained/ (クロック速度と3.6GHz)
- Wikipedia「Claude Shannon」 https://en.wikipedia.org/wiki/Claude_Shannon (1937年の修士論文。二次資料)
なおした ところ
更新履歴
更新履歴(改版の記録)
- 初版を公開。
このサイトでは、公開した記事の本文は原則として書き直しません。誤りが見つかったときや、内容が古くなったときだけ手を入れ、その理由をこの欄に残します。