6 + 4 = 10 である.
このとき,4 は 10 に対する 6 の補数であるという.
補数は,余数とも呼ばれる.
補数を用いれば,減算(M - N)を加算(M + [Nの補数])に変換して求めることができる.
→補数を利用した減算の説明
コンピュータでは負の整数を表現する際に,補数が使用される.
Nを正の整数とするとき,
負数 -N を2の補数である
2K-N
により表す.
(ただし,0≤N≤2K-1)
N | 1 | 2 | 3 | 4 |
---|---|---|---|---|
-N | -1 | -2 | -3 | -4 |
補数 | 7 | 6 | 5 | 4 |
ビット列 | 111 | 110 | 101 | 100 |
3ビットを使って2進数をカウントアップする
000, 001, 010, 011, 100, 101, 110, 111, 000, 001, 010, 011, 100, 101, ...
負数の表現に補数を用いると, 次のように数値を割り当てることができ,たし算をする場合に都合がよい。
...,  | 0002, | 0012, | 0102, | 0112, | 1002, | 1012, | 1102, | 1112, | 0002, | 0012, | 0102, | 0112, | 1002, | 1012, | ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
M, N を2進数 K-1 ビットで表される正の整数とする. このとき,0≤N<2K-1, 0≤M<2K-1である.
このMとNの減算,M-Nの補数を利用した計算方法を説明する.
Nに対する2kの補数は,2k - N である,M + (2K - N) = M - N + 2Kであるから,
2K - (M - N + 2K) = N - Mであるから,減算値の補数と一致する.
例えば,2進数3ビットの場合, 210=0102に対する23(=8)の補数は 6(=8-2)であり,610=1102であるから,
0112 (= 310) +) 1102 (= -210) ------------------------ 10012 桁溢れを無視すると 0012 (= 1)と桁溢れを無視すれば,正数と同じ手順で加算することができる.
次に,3に対する23(=8)の端数は
510=1012であり,
0102 (= 210)
+) 1012 (= -310)
------------------------
1112 桁溢れなし
桁溢れはないが,先頭ビットが1になっているので,結果は負数である.
補数を計算すると, 8-(111)2=8-7=110であるから,
計算結果は -1 であることがわかる,
n + m = 11...12であり,これに1を加えて,桁溢れを無視すると
n + m + 1 = 000...0002 = 0であるから
n = -(m+1)なる関係を満足する. このことから,
m = (-n) - 1 = |n| - 1であるから,
(1) | 3を2進数で表す(4ビット) | 0011 |
---|---|---|
(2) | 0と1を反転する | 1100 |
(3) | 1加える | 1100 + 1 = 1101 |
3 = (0001)2 → 1101
(1) | 20を2進数で表す(8ビット) | 00010100 |
---|---|---|
(2) | 0と1を反転する | 11101011 |
(3) | 1加える | 11101011 + 1 = 11101100 |
20 = (00010100)2 → 11101100
[別法]