2進数の引き算は補数で足し算に!繰り下がりの筆算から負の数まで解説
基本情報技術者試験の対策やプログラミングの基礎学習において、多くの学習者が最初に引っかかる壁が「2進数の引き算」です。「0から1を引くときの繰り下がり(桁借り)で頭が混乱する」「マイナスの計算になると正解できない」といった悩みを抱える人は少なくありません。
実は、コンピュータの内部では引き算専用の回路を使わず、すべて「足し算」として処理しています。その鍵を握るのが「2の補数」という概念です。この記事では、試験や実務で直感的に解ける筆算の手順から、2の補数を用いた減算のメカニズム、負の数や小数点の扱いまで、つまずきやすいポイントを余すところなく解説します。
📌 【この記事の重要ポイントまとめ】
- 要点1:2進数の筆算における「0-1」は、上の桁から「2(10₂)」を借りてくることで「2-1=1」として計算する。
- 要点2:コンピュータは「2の補数(全ビット反転+1)」を作り、加算器だけで引き算(A-B = A+(-B))を処理している。
- 要点3:基本情報試験では、最上位ビット(符号ビット)の扱いや加算時の桁あふれ(オーバーフロー)の判定が頻出。
【筆算の基本】2進数の引き算でつまずく「繰り下がり」と桁借りのコツ
まずは紙とペンで解く「筆算」の基本ルールを押さえます。10進数の引き算で「0-7」ができないときに上の桁から「10」を借りてくるのと同様に、2進数の引き算では上の桁から「2(2進数の10)」を借りてくるのが最大のポイントです。
2進数の1桁同士の引き算のパターンは以下の4つしかありません。
- 0 - 0 = 0
- 1 - 0 = 1
- 1 - 1 = 0
- 0 - 1 = 1(上の桁から1を借りて「2-1=1」にする)
具体例として、「1101₂ - 0110₂(10進数の13 - 6 = 7)」を筆算で計算してみます。
【筆算の手順】
・1桁目(最下位):1 - 0 = 1
・2桁目:0 - 1 は引けないため、3桁目の「1」から1を借ります。借りた1は2桁目では「2」になるため、2 - 1 = 1
・3桁目:1を貸したため「0」になっています。0 - 1 は引けないため、4桁目の「1」から1を借ります。2 - 1 = 1
・4桁目:1を貸したため「0」になっています。0 - 0 = 0
答えは「0111₂(10進数の7)」となり、正しく計算できていることが確認できます。
上の桁が「0」で連続して借りられない場合は、さらに上の「1」がある桁まで遡って順番に崩していく必要があります。慣れないうちは、借りて減った数字を筆算の上に小さくメモしておくことがミス防止のコツです。
【なぜ足し算に化けるのか】2の補数を使った減算の仕組みとコンピュータの秘密
筆算の桁借りは人間にとっては直感的ですが、電子回路で「繰り下がり」を判定するのは回路が複雑化し、コストも跳ね上がります。そこで現代のCPUは、「引き算を足し算に変換して処理する」仕組みを採用しています。これを実現するのが「2の補数」です。
身近な例で考えてみます。12時間表示のアナログ時計で「いま5時」のとき、3時間前の時刻を知るには「5 - 3 = 2時」と計算します。しかし、時計の針を逆回転させなくても、針を9時間進めると「5 + 9 = 14時 → 2時」と同じ結果にたどり着きます。12時間で1周する世界では、「-3」することは「+9」することと同等なのです。
コンピュータの固定ビット長(例えば8ビットや16ビット)の世界もこれと全く同じです。あふれた桁(最上位の繰り上がり)を無視できる環境を作ることで、負の数を別の正の数(補数)に置き換えて足し算だけで引き算を完結させています。これにより、CPU内部に減算器を用意する必要がなくなり、回路規模を大幅に削減できるメリットが生まれます。
【実践ステップ】1の補数から2の補数への変換と符号付き引き算の計算手順
2進数における「2の補数」の作成は、2ステップの機械的な操作で完了します。
【2の補数の作り方】
ステップ1(1の補数):元の数値のビットをすべて反転する(0を1に、1を0に)。
ステップ2(2の補数):反転した結果に「1」を加える。
例えば、8ビット表現で「5(00000101₂)」のマイナス値(-5)を作る手順は次の通りです。
1. 00000101 の全ビットを反転 → 11111010(1の補数)
2. これに1を足す → 11111011(これが「-5」を表す2の補数)
この変換を使えば、「A - B」という計算は「A + (Bの2の補数)」という足し算に置き換わります。
実際に「9 - 5 = 4」を8ビットの2の補数加算で実行してみます。
・9 = 00001001₂
・-5 = 11111011₂(先ほど求めた2の補数)
00001001
+11111011
────────
100000100
9ビット目に「1」の繰り上がりが発生しますが、8ビットの計算枠からはみ出た最上位ビット(桁あふれ分)を切り捨てると、残る数値は「00000100₂(10進数の4)」となり、正確な答えが導き出せます。
【例題でマスター】正の数・負の数・小数点を含む2進数引き算の完全パターン
実際の試験や演習では、計算結果がマイナスになるパターンや小数点を含む計算も問われます。主要な3つのパターンを例題で整理します。
パターン1:引く数の方が大きい場合(結果が負の数)
例題:「3 - 7」を4ビットで計算する。
・3 = 0011₂
・7 = 0111₂ → 2の補数はビット反転「1000」+ 1 = 1001₂(-7)
0011
+1001
──────
1100₂
最上位ビット(MSB)が「1」であるため、結果は負の数です。この「1100₂」が10進数でいくつなのかを確認するには、再度2の補数を取る(ビット反転+1)ことで元の絶対値が分かります。「1100」を反転すると「0011」、1を足すと「0100₂(4)」。したがって答えは「-4」です。
パターン2:負の数から負の数を引く場合(A - (-B) = A + B)
例題:「-2 - (-5)」を4ビットで計算する。
数式上は「-2 + 5」と同じです。-2(1110₂)と+5(0101₂)をそのまま足し算します。
1110
+0101
──────
10011₂ → 最上位の桁あふれを捨てると「0011₂(+3)」となります。
パターン3:小数点を含む2進数の引き算
例題:「11.01₂ - 1.10₂(10進数の3.25 - 1.5 = 1.75)」を筆算で計算する。
小数点の位置を揃えて、通常の筆算と同様に桁借りを適用します。
11.01
-01.10
──────
01.11₂
「01.11₂」を10進数に直すと、1×1 + 1×0.5 + 1×0.25 = 1.75。小数であっても、基数が2であることに変わりはないため、位取りを一致させれば整数と全く同じ手順で解くことができます。
【試験対策】基本情報技術者試験で差がつくオーバーフローと補数問題の攻略法
国家試験である「基本情報技術者試験」や「ITパスポート」では、単なる計算作業だけでなく、データ表現の限界に関する理論問題が頻出します。特に注意すべきは「オーバーフロー(桁あふれ)」の発生条件です。
例えば4ビットの符号付き固定小数点数(最上位が符号ビット、負数は2の補数)で表現できる範囲は、-8(1000₂)〜 +7(0111₂)です。この範囲を超えた演算を行うと、正しい結果が得られなくなります。
【オーバーフローが発生する鉄則】
・「正の数 + 正の数」の計算結果が「負の数」になった場合
・「負の数 + 負の数」の計算結果が「正の数」になった場合
※「正 + 負」の加算では、絶対に表現可能範囲を超えないためオーバーフローは発生しません。
試験問題で「A - B においてオーバーフローを検知する条件」を問われた場合は、引き算を「A + (-B)」の加算に変換した上で、加算する2つの数値の符号と、演算結果の符号の不一致を追跡することが正解への近道です。
【2進数の引き算】に関するよくある質問(FAQ)
Q1:なぜ「1の補数に1を足す」と2の補数になるのですか?
A1:ある数Xとその全ビットを反転させた1の補数X'を足すと、全ビットが「1」(例えば8ビットなら11111111₂=255)になります。ここに「1」を加えると桁上がりして「100000000₂(256=2⁸)」になります。つまり「X + X' + 1 = 2⁸」が成立し、「2⁸ - X = X' + 1」となるため、反転して1を足すだけで2の補数が作れます。
Q2:筆算と2の補数計算、手計算ではどちらを使うべきですか?
A2:試験で単純な正の数同士の引き算(例:11010₂ - 1001₂)を求めるだけであれば、筆算の方が素早く計算できます。一方、負の数が絡む問題や、「コンピュータ内部の処理手順」を問う問題では、必ず2の補数を用いた加算手順を使って解いてください。
Q3:最上位ビットの桁あふれ(繰り上がり)を捨てて良いのはなぜですか?
A3:コンピュータは8ビット、16ビット、32ビットなど固定のデータ幅で計算しているため、枠外にあふれたビットはレジスタに保持されず自動的に破棄されます。数学的にも、固定幅の最大値(2ⁿ)を加算して捨てる行為は「時計の針を1周させて元の位置に戻す」ことと同じであるため、計算結果の合同性が保たれます。
まとめ:今後の展望と注目ポイント
2進数の引き算は、一見すると繰り下がりのルールが複雑に思えますが、「2の補数を使えば足し算に変換できる」という根本原理を掴めば、機械的かつミスなく処理できるようになります。筆算における「上の桁から2を借りる感覚」と、ハードウェア視点での「ビット反転+1の加算処理」という2つのアプローチを両輪で身につけることが、基礎理論の完全な理解へと直結します。
ハードウェア設計や低レイヤのプログラミング、各種情報処理試験においても、2の補数とビット演算の考え方はあらゆるデータ処理の土台です。まずは手元のメモ帳で簡単な4ビットや8ビットの数値を書き出し、足し算への変換プロセスを実際に手を動かして体感してみてください。 (出典: 2 進数 の 引き算(Yahoo!ニュース))