⛓️

バイナリの加算と減算について

2021/01/17に公開

前提

コンピュータの中で行われている多種多様な命令を理解するうえで、2進数のブール算術を学ぶことは重要である。
ここでは2進数の加算と、符号付き2進数、いわゆる負の数の表し方と、減算をまとめる。

2進数

我々が日常で扱う数字は10を底とした数の10進数であるが、コンピュータの世界では2を底とした2進数が扱われる。0と1だけのバイナリである。

10進数の世界
10, 20, 12, 8...

2進数の世界(4ビットの例)
0100, 0001, 1111, 1010...

例えば、4ビットの1101を10進数の値で表現する場合、下記のようになる。

(1101)_{two} = 1・2^{3} + 1・2^{2} + 0・2^{1} + 1・2^{0} = 13_{ten}


10進数の13を2進数の値で表現する場合は、商が0になるまで2で割り続けて商と余りを求めるという方法が一般的である。あるいは、下記のように分解して考えても良い。

(13)_{ten} = 8 + 4 + 0 + 1 = 1 + 1 + 0 + 1 = 1・2^{3} + 1・2^{2} + 0・2^{1} + 1・2^{0} = 1101_{two}

2進数の加算

2進数の加算は、我々が普段扱う足し算と同じ要領で考えれば良い。つまり、2つの数を右から左へ各桁で足し合わせる。
この際、桁上りのビット=キャリービットがある場合、キャリービットと次の桁の和を足し合わせる。
最後の桁=最上位ビットのキャリービットが1である場合、割り当てられた容量を超えることになるため、「オーバーフロー」となる。

# オーバーフローの発生
# 4ビットの場合それ以上のビットに値を格納できない
 1101
+1101
------
11010
↓
1010

符号付き2進数

加算の方法はわかった。次に、減算を扱いたいとする。
そのためには、まずマイナスの符号付き2進数を扱えなければならない。

例えば、2進数の4ビットの場合、最大で10進数の15まで扱うことができる。
※1111 = 15

これは、n桁の2進数は2^n通りの異なるビット配列を表現できることを意味する。
このうちマイナスの数値も扱いたい場合は、2^n通りのビット配列を均等に分割することが一般的である。一方の領域をプラス、もう一方をマイナスとするのである。

では、具体的にマイナス数値を扱う場合の方法だが、ここで2の補数というアイデアが用いられる。

-x = 2^{n}-x

4ビットの場合、16-xということになる。
例に倣って4ビットの符号付き2進数を表すと、

0,1,2,3,4,5,6,7,-8(8),-7(9),-6(10),-5(11),-4(12),-3(13),-2(14),-1(15)

となる。
-4を表したいなら、16-4なので12、つまり1100(2進数)となる。


一般的に、符号付き2進数のプラス数値の配列とマイナス数値の配列は下記のように表される。

Plus : 0..2^{n-1}-1
Minus: -1..2^{n-1}


2進数におけるプラスの数値をマイナスの数値に変換する方法

ここでは、いわゆるマイナス数値を表す際のおまじない的に考えられている、2進数におけるプラスの数値をひっくり返して1を足すとマイナス数値に変換できる、という方法を見てみる。

先程、下記の2の補数というアイデアによってマイナス数値を表せると書いた。

-x = 2^{n}-x

これは、下記のように書き直せる。

-x = 2^{n}-x = 1 + (2^{n} - 1) - x

これによって2^n-1は1だけのバイナリとなり、xのバイナリを差し引くことが容易となる。
そしてこの引き算はxのバイナリを裏返すだけで表現できる。
最後に残った1を足せば、-xを表現できることになる。

具体的には、4ビットにおける4を(2の補数における)-4に変換して表したい場合、まず1だけのバイナリ1111から4を表すバイナリ0100を差し引く(裏返す)と1011となり、更に1を足すと1100(12)になる。

2進数の減算

2の補数でマイナスを扱えることがわかったので、前置きが長くなったが減算の表し方を見てみる。
例えば、4ビットで-2-3=-5といった減算をしたい場合、2の補数を使って表すと、

-2 - 3 = -2 + (-3) = 14 + 13 = 1101 + 1110 = (1)1011

となる。(最上位ビットはオーバーフロー)
オーバーフローにより5ビット目は無視されているため、14+13は本来27(11011)だが、11(1011)という計算結果となる。
そして、2の補数において11は-5である。これは本来求めたい計算結果である-5と一致する。

この方法の良いところは、内部的には加算だけで減算を表せているところである。
そのため、ハードウェアに追加で減算のロジックを加える必要がない。

Discussion