Subsections

3 [例題5]シフト演算

教科書のList 5-5のプログラムを例にして,シフト演算を使ったかけ算と割り算の方法を学習する. 以下のことが,ここでの学習の重要なポイントである. -5pt

3.1 積の演算

積(かけざん)の演算を行うとき,シフト命令を使えば効率の良いプログラムができる.ビッ トシフトを用いると積の演算ができる理由は以前述べているが,忘れた人もいるので,も う一度,説明する.

シフト命令を使った積の演算は,小学生のときに学習をした筆算の掛け算と同じである. たとえば, $ 34\times24$ を計算する場合,筆算は $ 34\times(2\times10^{1}+4\times10^{0})$ と分解したはずである.そうして,次の手順 でこの計算を行ったはずである. -3pt

  1. $ 34\times2$ を計算し,1桁ずらす(10倍する).
  2. $ 34\times4$ を計算する.
  3. 先の計算結果を合計する.この合計816が $ 34\times24$ の計算結果である.

同じことを2進数で行う.これがコンピューターによる乗算である.先ほどと 同じ計算( $ 32\times24$ )を行う.これを2進数で表現すると,

$\displaystyle (100010)_2\times(11000)_2=(100010)_2\times(1\times2^4+1\times2^3)$    

となる.これを先ほど同様の手順で計算する. -3pt
  1. 掛け算は1倍なので計算する必要が無く,最初に $ (100010)_2$ を4桁左 にずらす(ビットシフト).すると, $ (1000100000)_2$ となる.
  2. 次に $ (100010)_2$ を3桁左にずらす.すると, $ (100010000)_2$ となる.
  3. 先の計算結果を合計すると, $ (1100110000)_2$ となる.これは,10進 数の816である.
シフトと加算命令でかけ算ができることが分かったはずである.

今回の問題のように分数(少数)の場合でも,

$\displaystyle 0.75$ $\displaystyle =\frac{1}{2}+\frac{1}{4}$    
  $\displaystyle =\left(2^{-1}\right)+\left(2^{-2}\right)$ (1)

と分解する.右に1ビットシフトさせたものと,右に2ビットシフトさせたものを加算すれ ば良い.

教科書のように

$\displaystyle 0.75=1-\left(2^{-2}\right)$ (2)

と分解するのは一般的ではない.

3.2 プログラムの構造とフローチャート

このプログラムのフローチャートを図3に示す..
図 3: 教科書のList5-5のプログラムの構造とフローチャート
\includegraphics[keepaspectratio, scale=0.8]{flow_chart/REI5-5.eps}

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
2006-02-14


no counter