わっふるぶろぐ

わっふるが日々の出来事をただただ書いていきます~

『CODE』第13章 でも引き算はどうする?

第13章では、前章のたし算に続き、引き算の場合はどのように処理されるのかが書かれてました。ぜひ、前章も合わせてご通読ください!

 

waffle202.hatenablog.com

 

まずは、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より大きい数になる場合(オーバーフロー)と引き算が負の数になる場合(アンダーフロー)に点灯するようにします。外観は次のようなものです。

f:id:waffle202:20200301071812p:image

 

次に内部設計です。今回は、8ビット数の1の補数を計算する回路が必要です。ただし、引き算のときだけビットを反転させます。つまり、加減スイッチが0(Add)のとき入力はそのままで、1(Sub)のとき入力を反転させるゲートが必要です。これは第12章で使ったXORゲートそのものです!

f:id:waffle202:20200301164515p:image

回路は次のようになります。

f:id:waffle202:20200301190049p:image

これら8個のXORゲートを一つのボックスに入れて、「1の補数」というラベルを付けます。

f:id:waffle202:20200301190105p:image

ここで、1の補数ボックス、8ビット加算器ボックス、そして最後のXORゲートを、次のようにつなぐことができます。

f:id:waffle202:20200301184828p:image

「SUB」は加減スイッチの信号です。

  • SUB信号が0(Add)の場合は加算器のCO出力が1(オーバーフロー)のときに電球が点灯します(CO出力のまま)。
  • SUB信号が1(Sub)の場合は加算器のCO出力が0(アンダーフロー)のときに電球が点灯します(CO出力と反転)。

これを実現するために、最後のXORゲートを使います。

また、加算器のCI入力をSUB信号にすることによって、引き算のときに結果に1を加えることができます。

 

これで、減算も可能な8ビット加算器が完成しました!この章の後半では2の補数についても説明されてますが、尺が長くなるのでここでは割愛します。気になる方はWikipediaでご確認ください。

 

2の補数 - Wikipedia

 

これまで、コンピュータの演算について説明してきました。しかし、コンピュータのもう一つの基本である記憶についての話をしてません!これは第14章で説明します。

 

waffle202.hatenablog.com