今回は5つのテーマのうちの「5. 会社では習わないけどちょっと使えるコンピュータの知恵」についてご紹介いたします。
前回の記事で数値を10倍する方法を解説いたしました。前回は10回足し算したシンプルなものでしたが今回は、「シフト」を用いた10倍の方法をご紹介いたします。
シフトを使った10倍法
前回に引き続きアセンブリ言語で解説いたします。
コードの内容を簡単に解説すると。
- メモリ1に被乗数である「1」を代入。
- メモリ1を左に1桁シフトして2倍する。
- メモリ1の内容を一時メモリTMPにコピーする。
- メモリ1を左に2桁シフトして8倍する。
- 一時メモリTMPの内容をGR1に足しこむ。
- メモリ1に結果がある状態。
前回のプログラムよりだいぶスマートになりました。
使われている命令語の解説です。
- SLA(左シフト)値を2、4、8、16、32、64…倍にすることができます。
- DC(初期値)一時メモリを作るときに最初に入れておく値を設定します。
- TMP(ラベル)一時メモリを作るときにつける名前になります。自由につけることが可能です。
今回のプログラムのミソはシフトです。シフトを用いれば値を2の冪(にのべき)倍することができます。
冪とは10進数だと1、10、100、1000、10000…2進数だと0001、0010、0100、1000…のような数字の並びのことを言います。
なぜ2の冪なのかと言うと、2進数をシフトしているからです。10進数の10を1桁左にシフトすると100となり10倍になります。同じように2進数の0001を1桁左にシフトすると0010=2←10進数表記となり2倍になります。そして2桁左にシフトすれば4倍、3桁左にシフトすれば8倍することができます。
ちなみに右に1桁シフトすると1/2倍になります。これは割算の時に用いられます。
だた2進数のシフトでは10倍はできないので2倍と8倍の2つの値を作って足すという方法をとっています。じゃあ10の冪を使えばいいのでは?と思われますが、コンピュータは2進数しか扱えないので不可能です。
前回の10回足し算するプログラムよりも行数が少ないので処理時間が早くなります。
まとめ
今回のまとめです。
- シフトを使えば簡単に2の冪倍の値を作ることができる。
- コンピュータは2進数しか扱えないので10の冪は使えずシフトだけで10倍はできない。
今回は以上です。