例えば『0101』という2進数の数字があった場合、
0と1を反転すると、
- 1010
という数字になります。これを『1の補数』と言います。
1の補数を+1すると、
- 1011
という数字になります。これを『2の補数』と言います。
まとめると、
- 『0101』という2進数があったとすると、
- 0101の1の補数:1010
- 0101の2の補数:1011
となります。
この『補数』という概念が何の役に立つかというと、2進数の引き算に使えます。
補数とは?
冒頭に説明したとおり、補数とは、
- 1と0を反転したもの:1の補数
- 1と0を反転したものに+1:2の補数
です。
ただしこれは計算方法を表した表現なので、補数をより正しく日本語的に表現するなら、
- 1の補数:元の数に足して、桁上りしない数の最大値
- 2の補数:元の数に足して、桁上りする数の最小値
です。
1の補数
元の数(仮に「0101」)と1の補数を足したとすると、当たり前ですが全部「1」になります。
0101
+)1010
--------
1111
足したらちょうど全部1になる数が『1の補数』です。
2の補数
元の数(仮に「0101」)と2の補数を足したとすると、桁上りします。
0101
+)1011
--------
10000
すなわち、足したらちょうど桁上りする数が『2の補数』です。
負の数
元の数に2の補数を足したら、桁上りするので、最初の「1」を無視すれば、計算結果は「0」になることがわかります。
- 10000 → ...(最初の1を取ると)... →0000
計算結果後も同じ4桁で表示するとすれば、元の数に2の補数を足せば「0」になるため、「2の補数」は元の数の負の数として扱うことができます。
2進数 | 10進数 | |
---|---|---|
元の数 | 0101 | 5 |
2の補数(負の数) | 1011 | -5 |
この補数の特性を利用して、2進数の引き算をおこないます。
2進数の引き算のやり方
10進数だと、
- 6 - 4 = 2
ですね。
これが2進数だと、
- 0110 - 0100 = 0010
になります。
補数を使った引き算
引き算の部分を2の補数にしてみましょう。
0100を反転(1011)して+1。
- 1100 ※0100(10進数だと4)の2の補数
1100を0110に足します。
- 0110 + 1100 = 10010
頭の1を省くと、0010
足し算だけで、引き算をした場合と同じ計算結果が得られました。
なぜ補数を使うのか
なんのために補数を使うかというと、コンピューターはその仕組み上足し算しかできないので、足し算だけを工夫して計算をおこないます。
そこで補数というものを使って無理くり引き算をおこなうわけです。
補足:基数と減基数
n進数のnの部分(2進数なら2)を『基数』というのは前回解説したとおり。
この基数に-1したものを『減基数』(2進数なら1)といいます。
今回登場した『1の補数』『2の補数』は基数と減基数です。
10進数なら『9の補数』『10の補数』になりますし、16進数なら『15の補数』『16の補数』となります。
『減基数の補数』を元の数に足すとその桁の最大値(例えば10進数で4桁なら9999)、『基数の補数』を元の数に足すとその桁の繰り上がりの最小値(例えば10進数で元の数が4桁なら10000)になる特徴は同じです。