   
       
      1.加算回路と減算回路 
       (かさん かいろ と げんざん かいろ) 
      
       
      
      
      
      
      
      
      
      
       
      
       
       
      2進数1桁の足し算では、すべての組み合わせは4とおりです。 
       
      足した結果には、1桁目の値と、桁上がりの値が必要です。 
       
      これを表にしてみましょう。 
       
      表1-1  2進数1桁の加算 
      
      
        
          
            | A | 
            B | 
            1桁目 | 
            桁上がり | 
           
          
            | 0 | 
            0 | 
            0 | 
            0 | 
           
          
            | 0 | 
            1 | 
            1 | 
            0 | 
           
          
            | 1 | 
            0 | 
            1 | 
            0 | 
           
          
            | 1 | 
            1 | 
            0 | 
            1 | 
           
        
       
       
       
      1桁目と桁上がりを論理式で表現できないかを考えてみましょう。 
       
      AND、OR、NOTなどを使って、整理したものが表1-2です。 
       
       
      表1-2  加算を論理式で表現 
      
      
        
          
            | A | 
            B | 
            C = A and B | 
            D = A or B | 
            E = not C | 
            F = D and E | 
           
          
            | 0 | 
            0 | 
            0 | 
            0 | 
            1 | 
            0 | 
           
          
            | 0 | 
            1 | 
            0 | 
            1 | 
            1 | 
            1 | 
           
          
            | 1 | 
            0 | 
            0 | 
            1 | 
            1 | 
            1 | 
           
          
            | 1 | 
            1 | 
            1 | 
            1 | 
            0 | 
            0 | 
           
          
             | 
             | 
            (桁上がり) | 
             | 
             | 
            (一桁目) | 
           
        
       
       
       
      一桁目の部分は、A=Bのとき0、 A≠1のとき1となっています。 
       
      この演算を排他的論理和「EXOR(Exclusive OR)」とも呼び、 
       
      等しくないことを示す演算子でもあります。 
       
        
 
       
      
       
       
      表1-2から、1ビットの加算回路は次のようになることがわかるでしょう。 
       
             
                図1-1 1ビット加算器 
       
       
      1ビット以上になると、最下位ビット以外は、 
       
      下位からの桁上がりを更に加算しなければなりません。 
       
      だから、図1-2のように1ビット加算器が並ぶことになります。 
       
      (注意) 一般にNビットの加算では、N×(N+1)/2個の 
            1ビット加算器が必要となります。 
            図1-2では、Aの各ビットをAn、Bの各ビットをBn、 
            結果をCnと表記しています(n=0〜3)。 
       
           
       
                  図1-2 4ビット加算器 
       
        
      
 
       
      
       
       
      10進数の世界で、私たちが引き算を行うとき、下位の桁から順にやります。 
       
      桁ごとに、順に大きさを比較し、引かれる数が引く数より大きければ、 
       
      そのまま引き、引かれる数が小さければ、上位桁から10借りてきて・・・。 
       
      
      
        
          
              | 
            @) 1の位では2<8だから、10の位から10借りてくる。 | 
           
          
            | A) 10+2から8を引いて4を1位の値とする。 | 
           
          
            | B) 下位から10を借りられたので、7−1=6とする。 | 
           
          
            | C) 6−1=5を10の位とする。 | 
           
        
       
       
       
      さて、いかにも複雑ですね。と思う人は少ないでしょうか? 
       
       
      ここでちょっと視点を変えてみます。 
       
      今、上位桁から借りてくるのを最初にやってしまいましょう。 
       
       
      まず、100から18を引きます。 
       
      答えは82。 
       
       
      この計算は、つり銭の計算でよくやりますから、なれていますね。 
       
      この82に72を加えます。 
       
          72+82=154 
       
      最初,100を借りていたのですから、100を引いて54となります。 
       
       
          154−100=54 
       
       
      答えは、同じく54になりました。 
       
       
      あるいは、2桁の大きい正の値から、 
       
      2桁の小さい正の値を引いたのですから、 
       
      2桁以上を無視すればよいわけです。 
       
      
   
       
      1.4 補数(ほすう) 
      
       
      
       
      10進法で、計算の対象となっている数より大きい桁を持ち、 
       
      最上位が1で後は0の値、1.3の例で言えば100のことですが、 
       
      この値から数を引いた値を10の補数と呼びます。 
       
      たとえば、18の10の補数は82です。 
       
       
      同様に2進法で、計算の対象となっている数より大きい桁を持ち、 
       
      最上位が1で後は0の値から、数を引いた値を2の補数と呼びます。 
       
       
      2進数では0か1しかありませんから、 
       
      実は、この値を簡単に求めることができます。 
       
      まず、単純に引いて2の補数を求めた値と、 
       
      引く数の各桁のビットを反転した値を比較してみましょう。 
       
      
      
        
          
            | [単純に引いた値] | 
            1 0000 0000 − 0000 1101  | 
            = 1111 0011 | 
           
          
            | [ビットを反転した値]  | 
            0000 1101 の各ビット反転 | 
            = 1111 0010 | 
           
          
             | 
             | 
             | 
           
          
            | [単純に引いた値]
             | 
            1 0000 0000 ? 0000 1010 | 
            = 1111 0110 | 
           
          
            | [ビットを反転した値] | 
            0000 1010 の各ビット反転 | 
            = 1111 0101 | 
           
          
            | 
             | 
             | 
             | 
           
          
            | [単純に引いた値] | 
            1 0000 0000 ? 0000 0001 | 
            = 1111 1111 
             | 
           
          
            | [ビットを反転した値] | 
            0000 0001 の各ビット反転 | 
            = 1111 1110 
             | 
           
        
       
      
       
      各桁のビットを反転した値は、 
       
      単純に引いた値より1だけ少ない値になっています。 
       
      ですから、ビット反転した値に1を加えて補数をつくることができるわけです。 
       
       
        
       
      
       
       
       
      ビットの反転はNOTだけの回路です。 
       
            
              図1-3 ビット反転(8ビットのとき) 
       
       
      ビットを反転したあと、1を加算します。 
       
      この1の値としては、最下位ビットのみ1、 
       
      それ以外は0として加算器に入力すればよいわけです。
       
       
       
            
              図1-4 2の補数回路(8ビットのとき) 
       
      補数回路では、A0〜A7の全ビットが 0
      のとき、あふれビットが発生します。 
       
         
      
       
      
       
       
      さて、引く値の2の補数をとり、引かれる値と加算し、 
       
      あふれビットを無視すれば、結果的に減算が行われたことになります。 
       
            
                図1-5 8ビットにおける減算回路 
      
      
         
      
       
      
      
      
       
       
       |