【2進数】足し算で引き算を行う方法

2021年3月17日

今回は、タイトルにもあるように「足し算を使って引き算を行う方法」について解説します。以前、2進数の足し算の方法について解説しているので、参考にしてみてください。

2進数で引き算を行うことができないわけではありません。10進数の5-3のように、2進数でも101-11といった計算は可能です。

しかし、残念なことに、コンピュータでは引き算という概念が存在していません。どういうことかというと、足し算の考え方を駆使して引き算を行う必要があります。そのためには、補数という言葉について理解する必要があります。

補数

補数とは何のことだか分かりますか?漢字から読み解くと「補う数」ですよね。

ここで、ある数をxとしましょう。このxとyを足すと桁が上がるものとします。このときのyのことを補数といいます。

補数にはもう1つの種類があり、ある数xにzを足すとその桁数での最大値になるとき、このzのことも補数と言います。

…と、説明だけでは全く分かりませんよね(笑)。具体例を出して説明していきます。

10の補数と9の補数

まずは、10進数のときを考えましょう。

93という数字について考えましょう。7を足したら100になるので桁上がりが発生しますよね。このとき、7のことを補数と言います。厳密には、10の補数と言います。

続いて、93に6を足したら99になります。このとき、99は2桁で最大の数ですよね。もう1つ値を増やすと桁上がりが発生してしまいます。このとき、6のことを9の補数と言います。

当然ながら、着目する数の値が変われば補数も変わります。39について考える場合は、10の補数は61ですし、9の補数は60です。

以上の説明を読めばわかると思いますが、9の補数は、その桁で表せる最大数からある値を引くことで表せます。10の補数は、9の補数に1を加えることで表すことができます

1の補数と2の補数

先程、10進数の補数の話をしました。2進数では、9の補数と10の補数は存在せず、1の補数と2の補数が存在します。9の補数と10の補数のときと考え方は同様で、1の補数は、その桁数で表せる最大の数からある値を引いたときの数、2の補数は1の補数に1を加えた数です。具体例を見ていきましょう。

今回は、0011について考えることにします。2進数で4桁で表せる最大数は1111ですよね。なので、1の補数は1111-0011=1100ですね。2の補数は1の補数に1を加えればいいので1101です。

ちなみに、1の補数と2の補数はもっと楽に計算する方法があります。

今回の場合だと、0011をビット反転(1と0を入れ替える・0が入っている桁を1に、1が入っている桁を0に変更する)をすると、1100になります。これが1の補数であり、2の補数は1を加えるので1101です。

補数を足す=引き算

ここまでの説明で、補数について理解していただけたかと思います。

補数については分かったけど、そもそもどういう風に使うのかと言いますと…足し算の考え方を使って引き算を行うために使います。と言っても、ピンと来ないと思うので、具体例を出したいと思います。

先程10の補数について説明しました。93について考えた場合、7が10の補数でしたね。このとき、93に、補数である7を足したら桁上がりが発生して100になりますね。ここで、桁上がりの1を無視すると0になっていることが分かりますでしょうか。

同様の現象が2進数でも発生します。

5を2進数で表した00000101について考えてみましょう。この値に2の補数を足したら、桁上がりが発生して、その桁以外が0になります。見てみましょう。

図1

図1に示すように、00000101の2の補数は11111011です。これらを足すと、100000000です。

最上位桁の1は無視しましょう。見なかったことにしてあげましょう(笑)…そうするとこの計算は5にある数を加えると0ということになるので、11111011は-5を表していることになりますよね。というか、そういう風に考えることにします。

したがって、ある数の2の補数表現は、そのまま負の値として考えることができます

しかしながら、このままだと1つ問題が生じます。それは何かというと、足し算と引き算の区別がつけれないということです。

先程の図1を見てください。引き算の符号が計算のどこかに使われているわけではないので、純粋に足し算を行っているのか、補数を使って強引に引き算を行っているのかの区別がつきにくいのです。

この問題を解消するために、先頭の1ビットを符号ビットにして、先頭のビットが0のときは正の数、1のときは負の数というルールを作っておくことにします。こうすることで、足し算を行っているのか、負の数(補数)を使った引き算を行っているのかが区別できるかと思います。

今回の図1の場合は、00000101は先頭が0なので正の数、11111011は先頭が1なので負の数(補数)で引き算を行おうとしていることが分かりますね。

引き算の流れ

補数の概念や、補数を足すと引き算が実現できることが理解できましたね。ここで、1つの例を使って、実際に引き算を見てみましょう。

今回は、6-4について考えます。2進数で表現すると、0110-0100ですね。

0100の2の補数は1100なので、0110+1100=10010となり、最上位桁を無視することにより、答えは0010(つまり2)です。


今回は、補数と、補数を使った引き算について説明しました。補数については私も大学で初めて対峙したときに理解するのに苦戦した記憶があります。実際に問題を解きながら少しずつ理解していったので、ネット上の演習問題や、資格の過去問題、大学で勉強中の方は教科書の問題を解く中で慣れていくのが1番だと思います。アウトプットは最大のインプットとも言われますし。

というわけで、今回はここで終わりです。参考になれば嬉しいです。

最後までお読みいただき、ありがとうございました。