ブースの乗算アルゴリズムを使った計算のやり方

未分類
Photo by Mika Baumeister on Unsplash

こんにちは、コンスキです。

4ビットの2進数で表せる範囲の数字同士の乗算をブースのアルゴリズムを使ってやる方法を紹介します。

今回は、3×(-4)の計算を実際にやってみたいと思います。

2進数に変換する

計算する2つの値が10進数の場合は2進数に変換します。

3x(-4)の場合は、3がかけられる数で被乗数と呼ばれ、-4がかける数で乗数と呼ばれます。

被乗数と乗数を2の補数表現で表した4ビットの2進数に変換します。

3 → (0011)2        -4 → (1100)2

被乗数に関しては、符号を変えたものを4ビットの2進数に変換します

3 → -3 → (1101)2

表を書く

ブースの乗算アルゴリズムで計算する上で表を使います。

被乗数のビット数をx、乗数のビット数をyとします。

1 .3行(x+y+2)列の表を書きます。今回は乗数も被乗数も4ビットであるため、3行10列の表を書きます。

2. 1列目の各行にラベルをつけます。

A
S
P0
A・・・add(加算)の頭文字
S・・・subtract(減算)の頭文字
P・・・product(積)の頭文字

3. 1行目に被乗数を左詰めで入れます。

A0011
S
P0

4.2行目に被乗数の符号を変えたものを左詰めで入れます。

A0011
S1101
P0

5.3行目に乗数を入れます。この時、右側を1ビット空けるようにして入れます。

A0011
S1101
P01100ける

6.空いているマスに0を入れます。

A0011 0 0 0 0 0
S110100000
P0000011000

7.Pyのラベルまで行を増やします。今回は4ビットであるためP4までです。

A0011 0 0 0 0 0
S110100000
P0000011000
P1
P2
P3
P4

P0からP3までが途中の計算結果を入れておく行で、P 4が最終的な積が入る行になります。

計算する

ここからが計算する部分です。

計算の手順としては次のようになります。

Pの行の末尾2ビットを見る ▶︎ 条件に照らし合わせる ▶︎ 操作する

条件と操作

Pの行末尾2ビットを見て、それに応じて次のような操作をします。

末尾2ビット操作
00、11何もしないで右シフトする
01PにAの行をしてから右シフトする
10PにSの行をしてから右シフトする

それでは3×(-4)を実際に計算していきます。

P0の行の末尾2ビットを見ます。

A0011 0 0 0 0 0
S110100000
P0000011000
P1
P2
P3
P4

末尾2ビットは「00」であるため、何もせずに右シフトします。

操作をしたら、この数を下の行に入れます。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000001100
P2
P3
P4

今度はP1の行の末尾2ビットを見て操作します。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000011100
P2
P3
P4

末尾2ビットは「00」であるため、何もしないで右シフトします。

それをP2 の行に入れます。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000001100
P2000000110
P3
P4

今度はP2の行の末尾2ビットを確認します。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000001100
P2000000110
P3
P4

末尾2ビットは「10」であるため、P2の行にSの行を足します。

その後、右シフトします。

この数をP3に入れます。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000001100
P2000000110
P3111010011
P4

今度は、P3の行の末尾2ビットを見ます。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000001100
P2000000110
P3111010011
P4

末尾2ビットは「11」です。

そのため、何もせずに右シフトします。

その後、この数をP4の行に入れます。

A0011 0 0 0 0 0
S110100000
P0000011000
P1000001100
P2000000110
P3111010011
P4111101001

計算はこれで終わりです。

P4の行の一番右のビットを削除します。

これが3×(-4)の2進数での答えになっています。

答えの確認

先ほど計算で導き出した「(11110100)2」が本当に答えになっているのか確かめてみます。

10進数に直すと…

3×(-4)の答えも-12になるので、合っていますね!

コメント

  1. […] […]

タイトルとURLをコピーしました