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
並列乗算回路では、部分積の段数、つまり乗数Yの桁数分だけ BCブロック、つまりほぼ加算器が並びますので、 この段数が、全体の演算時間を決めるもっとも大きな要因となります。
まず、被乗数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を求める作業 | Q1 | Q2 | QN |
| 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 |