edubun
日本語

ゲートで数を足すしくみ

2つのビットを足すには、XORゲート1つとANDゲート1つで十分です。全加算器を4つつなげば、0から15までの2つの数を足せます。

先を読む前にやってみましょう。0101と0011を、10進数の足し算と同じやり方で、紙の上で2進数のまま足します。桁上がりは次の列の上に書きましょう。必要な事実は3つだけです。0 + 0 = 0、0 + 1 = 1、そして1 + 1 = 10、つまり0を書いて1繰り上げます。下の桁から繰り上がりがあるときは1 + 1 + 1 = 11なので、1を書いて1繰り上げます。計算は次の段落にあるので、先に隠しておきましょう。

計算はこうなります。いちばん右の列:1 + 1 = 10、0を書いて1繰り上げ。次:0 + 1に繰り上がりを足すとまた10、0を書いて1繰り上げ。次:1 + 0に繰り上がりを足して10、0を書いて1繰り上げ。いちばん左:0 + 0に繰り上がりを足すと1。答えは1000で、これは8です。5 + 3 = 8ですね。4つの列のうち3つで桁上がりがありました。電卓も、ゲームも、表計算ソフトも、最後にはまさにこれをしています。プロセッサーの中では、どの列も数個のゲートが受け持ち、シーンも同じ足し算から始まります。次に、そこで9 + 8を試してみましょう。5番目のビットが必要になります。

読み込み中

ドラッグで回転、スクロールまたはピンチで拡大・縮小。

A = 0101(5)、B = 0011(3)。桁上がりが右から3つの位を伝わり、和は1000(8)です。AやBのどのビットでもタップするか、メニューから数を選びましょう。9 + 8を試してみましょう。答えの17には5番目のビット、つまり左端から出る桁上がりが必要です。

いちばん右の列はゲート2つだけでよい

いちばん右の列だけを見てみましょう。そこでの答えのビット、つまり和は、ちょうど1つの入力が1のときに1です。これはXORの規則です。桁上がりは両方の入力が1のときだけ1です。これはANDの規則です。だから、同じ2つの入力を受け取るXORゲートとANDゲートを並べれば、2つのビットを足せます。この小さな回路が半加算器です。「半」なのは、右の列からの桁上がりを受け取る方法がないからです。

ほかの列では3つのビットを足す

ほかのどの列でも3つのビットが出会います。それぞれの数から1つずつと、右からの桁上がりです。全加算器はこの3つすべてを受け取ります。和はA XOR B XOR(下からの桁上がり)で、3つのうち奇数個が1のときに1です。上への桁上がりは、少なくとも2つが1のときに1です。半加算器2つとORゲート1つで全加算器が1つできます。全加算器を4つ並べ、それぞれの上への桁上がりを左どなりの加算器の下からの桁上がりにつなげば、4ビット加算器になります。最後の列が落ち着くまで、桁上がりが右から左へ順に伝わっていかなければならないので、この設計はリップルキャリー加算器と呼ばれます。実際のプロセッサーは、桁上がりを前もって計算する、もっと工夫された回路で64ビットの数を足しますが、各列の規則は同じです。

AB下からの桁上がり和上への桁上がり
00000
01010
11001
10101
11111

答えが大きすぎるとどうなるか

4ビットには0から15が入ります。9と8を足すと本当の答えの17は2進数で10001、つまり5ビットです。4ビットしか持たないレジスタには0001、つまり1が入り、左に余った桁上がりが警告の印になります。これがオーバーフローです。4ビットで15 + 1を計算すると0000が残ります。プロセッサーはこれが起きるとフラグを立て、プログラムが気づけるようにします。引き算も同じ加算器を使います。A − Bを求めるには、プロセッサーはBのすべてのビットを反転して1を足し、Bの2の補数を作ります。それをAに足して、余分な桁上がりを捨てます。4ビットで5 − 3を計算すると、3は0011、反転すると1100、1を足すと1101です。そして0101 + 1101 = 10010で、4ビットだけ残すと0010、つまり2です。

かけ算はずらして足すこと

かけ算も同じ部品からできます。2進数で2をかけると、すべてのビットが1つ左にずれます。10進数で10をかけると0が1つ増えるのと同じです。0011(3)は0110(6)になります。5 × 3では、3が2 + 1であることに注目しましょう。だから5 × 3 = 5 × 2 + 5 × 1 = 1010 + 0101 = 1111で、15です。乗算回路は、2つ目の数の1のビットを1つずつ取り上げながら、このようにずらして足していきます。

よくある間違い
  • 「1 + 1 = 2だから、答えは1ビットに入る」 1ビットには0か1しか入りません。1 + 1 = 10:和のビットは0で、1が繰り上がります。桁上がりを捨てると答えは0になり、まちがいです。
  • 「半加算器はどんな長さの数でも足せる」 半加算器には右からの桁上がりを受け取る入力がないので、いちばん右の列でしか使えません。ほかの列ではどれも、入力が3つの全加算器が必要です。4ビット加算器なら、半加算器1つと全加算器3つで作れます。
  • 「オーバーフローするとコンピューターはエラーで止まる」 加算器は、入るだけのビットを残すだけです。4ビットで9 + 8を計算すると0001になります。まちがった答えなのに、まったくふつうに見えます。プロセッサーはフラグを立て、それを調べるのはプログラムの役目です。
  • 「引き算には専用の引き算回路が必要だ」 Bのビットを反転して1を足し、その結果を同じ加算器でAに足します。5 − 3:0101 + 1101 = 10010で、下位4ビットの0010は2です。
先生からひとこと「加算器」という言葉を出す前に0101 + 0011の足し算を出し、学習者に列の上へ桁上がりを書かせましょう。そうすれば、半加算器と全加算器の表のほとんどを、自分の計算から読み取れます。迷いやすいのは半加算器から全加算器への一歩です。足し算の2列目を指して、そこで何ビット足したかを聞きましょう。答えは3つです。桁上がりが伝わるようすは、4人が一列に並んで桁上がりのカードを左へ渡すと、簡単に演じられます。2の補数は手で1つの例をゆっくりやる必要があります。シーンでは引き算ができないので、黒板で5 − 3を計算し、0010が2になることを確かめましょう。
  1. 2進数で1 + 1はいくつですか?
  2. 半加算器で和のビットを出すのはどのゲートですか?
    • XOR
    • AND
    • OR
    • NOT
  3. 半加算器で桁上がりを出すのはどのゲートですか?
    • AND
    • XOR
    • OR
    • NAND
  4. 全加算器は入力ビットをいくつ受け取りますか?
  5. 全加算器にA = 1、B = 1、下からの桁上がり = 1が入ります。和のビットはいくつですか?
  6. 0110と0011を足しましょう。4ビットで答えましょう。
  7. 4ビットのレジスタで9 + 8を計算し、4ビットだけを残します。入っている数はいくつですか?
  8. 0011の4ビットでの2の補数は何ですか?
  9. 8ビットの数のためのリップルキャリー加算器には、全加算器がいくつ必要ですか?
  10. 4ビットの数2つを足したとき、和の最大はいくつですか?
ポイント
  • 半加算器:和 = A XOR B、桁上がり = A AND B。
  • 全加算器:入力は3つ。1が奇数個なら和が1、2つ以上なら桁上がりが1。
  • 全加算器をつなぐとリップルキャリー加算器になる。桁上がりは右から左へ進む。
  • オーバーフロー:結果にレジスタより多いビットが必要になること。引き算は2の補数を足す。
このコースの出典 (9)
  • (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
  • Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
  • IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
  • IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
  • Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
  • Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
  • Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
  • abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
  • John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).

確認日: 2026-10-17