皆様は、コンピュータが加算や減算をどのように処理しているか、深く考察されたことはありますか?
私たちが日常的に用いる十進数における計算は直感的ですが、コンピュータが扱う二進数の世界においては、特定の工夫が求められます。特に減算は、コンピュータにとって直接的な処理が困難な操作です。この課題を解決するために導入されたのが「補数」の概念です。補数を用いることにより、コンピュータは減算を加算として処理することが可能となり、演算処理の簡素化および高速化を実現しています。
この原理を理解することは、コンピュータの内部動作を深く掘り下げて理解する上で極めて有益であるだけでなく、将来的にプログラミングにおいて数値計算を扱う際や、情報セキュリティにおける暗号技術の基盤を学ぶ上でも不可欠な知識となります。それでは、補数の世界を探求し、コンピュータが効率的な演算を実行する秘密を共に解き明かしていきましょう。
キーワード
- 補数
- 減算
補数とは何か?

補数とは、ある基準となる数値から、元の数値を減算した結果の数値を指します。この定義だけでは抽象的であるため、具体的な例を通じて詳細に解説します。
補数には、大きく分けて以下の二つの種類が存在します。
- 基数の補数(Radix Complement)
- 減基数の補数(Diminished Radix Complement)
情報分野、特にコンピュータ内部の演算処理において利用されるのは、主に基数の補数です。二進数においては2の補数、十進数においては10の補数がこれに該当します。
まずは、分かりやすい10の補数について見ていきましょう。
10の補数による概念理解(十進数の場合)
まず、私たちが日常的に使用する十進数を用いて、補数の概念を考察します。ここでは、桁数を固定して考えます。例えば、2桁の数値について検討してみましょう。
10の補数:100からその数値を減算した値」として定義されます。
例)25の10の補数:\(100−25=75\), 80の10の補数:\(100−80=20\)
この10の補数は、ある数値に加算した際に、固定された桁数を超えて桁上がりする最小の数値と解釈することもできます。
例えば、25に75を加算すると100(2桁をオーバーする最小の数値)になります。
【本題】2の歩数とは
先ほど、「補数とは、ある数値に加算した際に、固定された桁数を超えて桁上がりする最小の数値」といいました。
2の補数は、ある二進数に加算すると桁上がりする最小の数値、あるいは、「指定された桁数の最大値 + 1」からその二進数を減算した値として定義されます
2の補数:二進数に加算すると桁上がりする最小の数値
例えば、4ビット(4桁)の二進数について考えます。
4ビットで表現可能な最大値は\( 1111_2\) (十進数で15)です。これに1を加算すると \(10000_2\) (十進数で16)となります。
n ビットの2の補数: ある二進数 X の2の補数は、\(2^n−X\) によって計算されます。
例えば、4ビットの二進数 \(0101_2\) (十進数で5)の2の補数を求めてみましょう。
\[2^4 − 0101_2 =10000_2 − 0101_2 = 1011_2 (十進数で11)\]
したがって、\(0101_2\) の2の補数は \(1011_2\) です。 実際に \(0101_2+1011_2=10000_2\) となり、4ビットを超えて桁上がりしていることが確認できます。
2進数 X の2の歩数は、\(2^n−X\) で求められることがわかりました。しかし、2の補数はもっと機械的に求めることができます。
2の補数の簡便な算出方法
2の補数を算出する際には、前述の減算を用いるよりも簡便な方法が存在します。
2の補数の算出方法
- 元の二進数のすべてのビットを反転させます(0を1に、1を0に変換)。この操作によって得られる数値は1の補数と呼ばれます。
- 反転させた結果に1を加算します。
\(0101_2\) の2の補数を求めてみましょう。上記の算出方法通りに操作を行います。
- ビットを反転させる: \(0101_2\)→\(1010_2\) (1の補数)
- 1を加算する: \(1010_2\)+\(1_2\)=\(1011_2\)
前章で確認した\(2^n-X\)の式も使って求めてみましょう。
\[2^4 – 0101_2 = 1011_2\]
両方の方法ともに同じ結果になりました。この方法を用いることで、減算よりも効率的に2の補数を算出することが可能です。
なぜビット反転 & +1で求まるのか
この章では、なぜビット反転と+1をすると2の補数が求まるのか確認していきます。
2の補数がビット反転と+1で求まるのは、負の数を表現する際に、すべてのビットが1である数(−1 に相当)から元の数を引くという計算に基づいているためです。
例えば、4ビットの2進数で\(A\)の2の補数を考えましょう。 本来の定義は \(2^4−A\) です。 ここで、\(2^4\) は \(10000_2\) です。 これを \(1111_2+1_2\) と分解できます。
つまり、\(2^4−A=(1111_2+1_2)−A=(1111_2−A)+1_2\) となります。
\(1111_2−A\) は、Aの各ビットを反転させた値に等しくなります。なぜなら、\(1111_2\) はすべてのビットが1であり、あるビットが0であれば1を引くと1に、1であれば1を引くと0になるからです。
したがって、2の補数は「ビット反転した値に1を加える」ことで求められるのです。この簡便な計算方法が、コンピュータの効率的な減算処理を実現しています。すごい。
なぜ補数が利用されるのか?

では、なぜコンピュータはあえて補数を用いて演算を行うのでしょうか。その理由は、主に以下の二点に集約されます。
1. 減算を加算で実現するため
これが補数を利用する最大の理由です。コンピュータの電子回路において、加算を実行する回路(加算器)の設計は比較的容易です。しかし、減算を実行する専用の回路を別途用意することは、回路の複雑化を招き、製造コストの増加に繋がります。
そこで補数を用いることで、「ある数値から別の数値を減算する」という操作を「ある数値に別の数値の補数を加算する」という操作に置き換えることが可能になります。
例題
\(7−3\) を2の補数を用いて計算してみましょう。(4ビットで表現)
2進数で7は \(0111_2\), 3は\(0011_2\)です。
3の2の補数を算出します。
\(0011_2\) のビットを反転: \(1100_2\)
1を加算する: \(1100_2\)+\(1_2\)=\(1101_2\) (これが −3 を表す2の補数表現となります)
ポイント
引き算を足し算として計算するために、補数を活用する。-3を2の補数で表すと\(1101_2\)である。
次に、7+(−3) を計算します。ここでのポイントは、\(0111_2-0011_2\)という式を解かず、以下の式を計算します。
\[0111_2 + 1101_2 = 10100_2\]
\(0111_2\)は7、\(1101_2\)は-3の補数表現です。
この結果において、最上位の桁(桁上がりした部分)は無視されます。(今は4ビットという条件があるから。)すると、\(0100_2\) が残ります。\(0100_2\) は十進数で4です。 このように、7−3=4 が正確に計算されました。
この仕組みにより、コンピュータは単一の加算器で減算処理も実行できるようになり、回路設計の簡素化と効率的な動作が実現されるのです。
2. 負の数を表現するため
コンピュータでは、通常、最上位ビット(最も左に位置するビット)を符号ビットとして利用し、数値の正負を表します。
- 符号ビットが0の場合: その数値は正の数です。
- 符号ビットが1の場合: その数値は負の数です。
そして、負の数を表現する際に2の補数表現が用いられます。これにより、正の数と負の数を統一的に扱うことが可能となり、加減算回路を共通化することができます。
まとめ

本稿では、コンピュータがどのように効率的な演算を実行しているのか、その基盤となる補数について解説いたしました。
補数、特に2の補数は、コンピュータが減算を加算として処理し、負の数を効率的に表現するための極めて重要な概念です。
- 補数: ある基準となる数値から元の数値を減算した結果の数値。
- 2の補数の算出: ビットを反転させた後、1を加算する。
- 補数の役割:
- 減算を加算で実現し、回路を簡素化する。
- 負の数を効率的に表現し、正負の数値の加減算を統一的に行う。
補数の概念は、一見すると複雑に感じられるかもしれませんが、コンピュータが私たちの日常生活においてあらゆる演算を高速に処理している根幹をなす技術です。この概念を理解することは、コンピュータの動作原理をより深く洞察できるようになるための第一歩となるでしょう。
コメント