W.I.S. Laboratory
menu-bar

補数


「2の補数」「1の補数」とは何か

コンピュータ関連の資料を読んでいると、よく「2の補数」とか「1の補数」という言葉が出てくる。
この場合の「2の補数」というのは「2進法における基数の補数」のことであり、「1の補数」というのは「2進法における減基数の補数」のことだ。
補数には基数の補数減基数の補数の2種類がある。

基数の補数とはざっくり言うとそれを足せば引き算しなくても引き算相当の結果を得られる数のことだ。
A - B をしたいときに、A + X して最上位を切り捨てれば同等の結果が得られる X の値のことを、10進法であれば「Bの10の補数」といい、2進法であれば「Bの2の補数」という。
例を上げると、
1の10の補数は9
5の10の補数は5
7の10の補数は3
46の10の補数は54
8254の10の補数は1746
つまり「それを足したら桁が繰り上がる最小の数」のことだ。
これを進法に関係なく言うと基数の補数となる。

例えば、10進法で 6 - 2 をしたいとき、2に何を足したらギリギリ桁が繰り上がるかを考える。
8を足せば10になりギリギリ繰り上がるので、2の10の補数は8だ。
ということで 6 + 8 をする。
結果は 14 となり、最上位を切り捨てると 4 が得られる。
基数の補数を使うと、引き算を使わずに引き算相当の結果を得ることができた。

これを、基数が2である環境下(つまり2進法)で得たものが「2の補数」だ。

減基数の補数とはざっくり言うと基数の補数から1を引いたもののことだ。
減基数というのは、基数から1を引いたものであり、10進法なら9、2進法なら1となる。
例えば、
1の9の補数は8
5の9の補数は4
7の9の補数は2
46の9の補数は53
8254の9の補数は1745
となる。
つまり「それを足しても桁が繰り上がらない最大の数」のことだ。
これを進法に関係なく言うと減基数の補数となる。

これを、減基数が1である環境下(つまり2進法)で得たものが「1の補数」だ。
2進法環境下であれば、
0の1の補数は1
1の1の補数は0
となる。
つまり1の補数は、ビット列をXORしたものと等しい。
これに1を足せば2の補数となる。
CPUのレジスタの値をもとに2の補数を得たければ、XORをとって+1すれば良い。

補数があれば減算命令がないCPUでも減算をすることができる。
Aレジスタ - Bレジスタ の結果は、Bレジスタ値をXORしてインクリメントし、Aレジスタに加算すれば(最上位はオーバーフローして自動的に切り捨てられるので)求まるわけだ。
乗算は加算の組み合わせで実現できるし、除算は減算(つまり補数を使った加算)の組み合わせで実現できる。
足し算さえできれば四則演算すべてが可能になるというわけだ。


[ 戻る ]
saluteweb