1001  :被乗数(X)
×) 0101  :乗数  (Y)
----------
    1001  :部分積
   0000
  1001
 0000
---------
 0101101 (0x2d = 45(dec))
乗数Yの各桁に対して、被乗数Xを順番にずらして
並べていき、最後にすべてを足すわけですが、
途中の、被乗数Xを順番にずらしていった項を
部分積と呼びます。
部分積を求めるのは簡単で、
被乗数Yの、その桁が1であればXそのもの、
その桁が0であれば0、となります。
一般に、N桁の被乗数Xと乗数Yを、次のように表現することにしましょう。
                                  x3      x2       x1     x0    被乗数X
                           ×)    y3      y2       y1     y0    乗数Y
                        ---------------------------------------
                                x3・y0  x2・y0  x1・y0  x0・y0  部分積0
                        x3・y1  x2・y1  x1・y1  x0・y1          部分積1
                x3・y2  x2・y2  x1・y2  x0・y2                  部分積2
        x3・y3  x2・y3  x1・y3  x0・y0                          部分積3
---------------------------------------------------------------
  z7      z6      z5      z4      z3      z2      z1      z0    積Z
(「VLSI工学-基礎・設計編-」(岩田、コロナ社)p.55より)
この回路の部分積の加算の部分は、ちょっと工夫がしてあって、 全加算器の入力が3つであることを使って、 1つの行(横並び)の中でキャリーの伝播をさせず、 それを、次の行の全加算器の入力のひとつにつないであります。 (このような構成を、キャリー保存加算器(CSA)と呼びます) ただし最後(一番下)に、前の行(最後の部分積の和を求めている)から 先送りされていたキャリーをすべて最後の結果に反映させる (キャリーの吸収と呼びます)必要がありますので、 最後の行だけは、普通の多ビット加算器が必要になり、 キャリー伝播加算器(RCA)やキャリー先見加算器(CLA)などが 使われます(この例ではCLAを使っている)。 このような構成の乗算器を並列乗算回路と呼びます。
並列乗算回路では、部分積の段数、つまり乗数Yの桁数分と ほぼ等しい数だけ加算器が並びますので、 この段数が、全体の演算時間を決めるもっとも大きな要因となります。
まず、被乗数Xと乗数Yを、N桁の符号つきの2進数で 次のようにあらわすことにします。
x2=0(正の数) x2=1(負の数) ---------------------------- 000 (0) 100 (-4) 001 (1) 101 (-3) 010 (2) 110 (-2) 011 (3) 111 (-1)つまり最上位ビットx3-1が0の数から、 -4 = -1・23-1をひくと、 最上位ビットx3-1だけを1にした数、になっていますから、 先の式のように、 「-1・xN-12N-1」という項を含めて、 負の数と正の数をまとめて表すことができるわけです。
ここで、やや唐突ですが、次のようなYjを考えましょう。
ポイントは、この加算が、(N-2)/2回、つまり普通に部分積を足していく場合の 半分程度の回数で済む、ということです。 これは、y2j +y2j-1 - 2y2j+1という項を 使って、1個とばしで部分積を足していく方法、と考えることができます。
このうち、Yjに含まれる y2j, y2j-1, y2j+1の組み合わせは 8通りしかありませんから、それをまとめると次のようになるでしょう。
| y2j+1 | y2j | y2j-1 | Yj | Zj | Zjを求める作業 | A | B | M | 
| 0 | 0 | 0 | 0 | 0 | 何もしない | 0 | 0 | 0 | 
| 0 | 0 | 1 | 1 | X・22j | 2j ビットシフト | 1 | 0 | 0 | 
| 0 | 1 | 0 | 1 | X・22j | 2j ビットシフト | 1 | 0 | 0 | 
| 0 | 1 | 1 | 2 | X・22j+1 | (2j+1)ビットシフト | 0 | 1 | 0 | 
| 1 | 0 | 0 | -2 | -X・22j+1 | (2j+1)ビットシフトし、2の補数 | 0 | 1 | 1 | 
| 1 | 0 | 1 | -1 | -X・22j | 2j ビットシフトし、2の補数 | 1 | 0 | 1 | 
| 1 | 1 | 0 | -1 | -X・22j | 2j ビットシフトし、2の補数 | 1 | 0 | 1 | 
| 1 | 1 | 1 | 0 | 0 | 何もしない | 0 | 0 | 0 | 
まずX, Yを2進数で求めると次のようになります。
| j | y2j+1 | y2j | y2j-1 | Yj | Zj | 
| 0 | 0 | 1 | 0 | 1 | X・20 | 
| 1 | 1 | 0 | 0 | -2 | -2X・22 | 
| 2 | 0 | 1 | 1 | 2 | 2X・24 | 
Z0 =                  11111110111 (11桁にあわせる)
Z1 = -2・  11011100 = 00001001000 (11桁にあわせる)
Z2 =  2・1101110000 = 11011100000
----------------------------------
                      11100011111
この求められた結果は、2進数で2の補数の00011100001 = 225の
負の数=-225ですから、たしかに-9×25 = -225となっていることが
わかります。