第13章では、前章のたし算に続き、引き算の場合はどのように処理されるのかが書かれてました。ぜひ、前章も合わせてご通読ください!
まずは、2進数の引き算のやり方を紹介します。が、引き算は桁借りが発生する場合があり、たし算と本質的に異なります。桁借りはゲートでは実現が難しそうなので、桁借りをしない引き算のやり方を紹介します。
1 1 1 1 1 1 0 1
- 1 0 1 1 0 0 0 0
最初のステップは、減数(引く数)を1111 1111から引きます。
1 1 1 1 1 1 1 1
- 1 0 1 1 0 0 0 0
0 1 0 0 1 1 1 1
2進数では、減数を1の列から引くと、結果は1の補数と呼ばれるものになります。この作業はありがたいことに、元の数の0を1に、1を0に反転するだけでいいのです!
ステップ2はこれを被減数(引かれる数)に加えます。
1 1 1 1 1 1 0 1
+ 0 1 0 0 1 1 1 1
1 0 1 0 0 1 1 0 0
ステップ3は結果に1を加えます。
1 0 1 0 0 1 1 0 0
+ 1
1 0 1 0 0 1 1 0 1
最後のステップは1 0000 0000を引きます。
1 0 1 0 0 1 1 0 1
- 1 0 0 0 0 0 0 0 0
0 1 0 0 1 1 0 1
結果はちゃんと1111 1101(253)と1011 0000(176)の差0100 1101(77)になっています。そして、一度も桁借りをしていません!それでは、これを実現する減算も可能な8ビット加算器を設計していきましょう!
まずは外部設計です。第12章の加算器に足し算(Add)か引き算(Sub)かを選択するスイッチ(加減スイッチ)を追加します。また、9番目の電球には「Overflow/Underflow 」というラベルを付け、足し算が255より大きい数になる場合(オーバーフロー)と引き算が負の数になる場合(アンダーフロー)に点灯するようにします。外観は次のようなものです。
次に内部設計です。今回は、8ビット数の1の補数を計算する回路が必要です。ただし、引き算のときだけビットを反転させます。つまり、加減スイッチが0(Add)のとき入力はそのままで、1(Sub)のとき入力を反転させるゲートが必要です。これは第12章で使ったXORゲートそのものです!
回路は次のようになります。
これら8個のXORゲートを一つのボックスに入れて、「1の補数」というラベルを付けます。
ここで、1の補数ボックス、8ビット加算器ボックス、そして最後のXORゲートを、次のようにつなぐことができます。
「SUB」は加減スイッチの信号です。
- SUB信号が0(Add)の場合は加算器のCO出力が1(オーバーフロー)のときに電球が点灯します(CO出力のまま)。
- SUB信号が1(Sub)の場合は加算器のCO出力が0(アンダーフロー)のときに電球が点灯します(CO出力と反転)。
これを実現するために、最後のXORゲートを使います。
また、加算器のCI入力をSUB信号にすることによって、引き算のときに結果に1を加えることができます。
これで、減算も可能な8ビット加算器が完成しました!この章の後半では2の補数についても説明されてますが、尺が長くなるのでここでは割愛します。気になる方はWikipediaでご確認ください。
これまで、コンピュータの演算について説明してきました。しかし、コンピュータのもう一つの基本である記憶についての話をしてません!これは第14章で説明します。