ビットシフトには前章のように、ビットごとに値を操作する使い方よりも、
演算として使用する頻度が高い(気がする)演算です。

ビットごとの処理に使ってみる

出力の時

例えば、3052のP8に,BYTEアクセスで(LEDの点灯の)状態を書き込みたい時、
led0,led1,led2という変数に0か1が入っているとして、
(それぞれ0,1,2bit目に対応とすると)

P8.DR.BYTE = (P8.DR.BYTE & 0xf8) ;//クリアしておく
P8.DR.BYTE = P8.DR.BYTE | led0 | (led1 << 1) | (led2 << 2);

みたいな書き方ができます。

P8.DR.BYTE = (P8.DR.BYTE & 0xf8) ;//クリアしておく
P8.DR.BYTE = P8.DR.BYTE + led0 + (led1 << 1) + (led2 << 2);

でも全く同じになります。

入力の時

一番使用する頻度が高いのはAD変換での取り込みだと思います。
H8-3052では10bitしか変換精度がないA/Dコンバータの変換結果を、
16bitのデータレジスタに(何故か)上位bitから詰め込んであります。
つまり、下位6bitは何の意味もないデータです。
そこを捨てるのにbitシフトをよく使います。

result = adresult >> 6; //下位6bitを捨てて10bitの結果を取り出す

ライントレーサであれば3bitか4bitもあれば(多分)十分なので、
直感的に扱う事ができるように12bitシフトしてしまうというのも手です。

また、15bitシフトさせると0か1が結果として残ります。
2.5V付近を行き来する値の場合,15bitシフトさせるのも手です。
(はじめからI/Oポートに繋いでもほぼ同じ事ですが)

演算に利用してみる

ビットシフトは演算としての意味合いが大きいです。

右にnビットシフトすることは、元の値を2のn乗で割る事に対応します。
同様に、左にnビットシフトするのは、元の値に2のn乗を掛ける事です。
※右にシフトしたとき、”あまり”は電子の海に消えます。

特に、割り算として利用できるというのは大きな利点です。
なぜなら、コンピュータは割り算が苦手なので、普通に割り算を計算させると
普通の演算(加減乗)の数十倍の時間がかかったりするからです。

ので、処理速度が欲しい箇所などでは、積極的に使うと(きっと)効果大です。


使いどころのサンプルがありませんが、いたるところで使えると思うのでどうぞ。

/home/users/2/deca.jp-mice/web/cgi/dokuwiki/data/pages/ビットシフトの使い方.txt · 最終更新: 2010/06/23 01:44 by member
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0