■ 強制的に偶数にする
例えばマウスからの入力座標を強制的に偶数にしたいとき、こんな場合は
にする。なぜFFFFFFFEかというと、マウス座標は通常Long型で表されるので、4バイトなのである。4バイトという事は16進数にすると8桁なのでこのような数値になる。ついでに
にすると、8単位に数値を丸めることができる。
■ スイッチのON/OFFを切り替える
プログラム中でスイッチやフラグが必要になったときは通常、0がOFFで1がONというように考える。スイッチの変数をSWと宣言して1だったら0に、0だったら1に切り替えるプログラムを作るとする。それをifを使って行うと
if (SW=0) Then SW=1 Else SW=0
になる。これでも問題はないのだが、ifは通常スピードが遅い。そこで
とする。数値の論理演算はスピードが速いのである。
■ 色数を減らす
通常Windowsでは色をRGBそれぞれ1バイト(8ビット)で表す。その場合色数は1600万色である。これはフルカラーとかTrue Colorとか呼ばれている。1バイトだから256種類、それが3個だから256×256×256= 16777216色なのである。減色したい場合がある。
ビット数と色数の関係を表に示すので参考にしてもらいたい。
例えばフルカラーで表されているカラーコードを512色以内に丸めたい場合を考える。フルカラーの場合は各色8ビットで表されている。例えば赤の成分が99だったとする。
である。512色ということは表を参考にすると各色3ビットしか使えないことになる。3ビット以内に数値を丸めるということは、2進数で表したときに上の方(左側)の3ビットを残して捨てれば良い。したがって
ビット数 | |
B | G | R | 合計 | 色数 |
1 | 1 | 1 | 3 | 8 |
2 | 2 | 2 | 6 | 64 |
2 | 3 | 3 | 8 | 256 |
3 | 3 | 3 | 9 | 512 |
5 | 5 | 5 | 15 | 32768 |
5 | 5 | 6 | 16 | 65536 |
8 | 8 | 8 | 24 | フルカラー |
という論理演算をすれば良い。結果は
になる。1110 0000は16進数で&HE0なので、実際には
Pic.Pset(x, y), Pic.Point(x, y), &HE0E0E0
とすれば良いことになる。
■ 特定のビット情報を取り出す
ピクチャーボックスなどの情報を取り出す命令でPointというのがある。
というように使用する。これで、XYで指定した場所に表示されているカラーコードを取り出すことができる。
という構成になっているので、例えばここで緑の成分を取り出したい場合は
G = Pic.Pset(X, Y) And &HFF00&
G = G / &H100
とすれば良いのである。
■ 特定のビットをマスクする
現在製作中のプログラムのピクチャーボックスを左ダブルクリックしてみよう。するとピクチャーボックスのClickイベントのコードが表示される。次にそのウインドウの上の右側にあるイベントリストを開いて、MouseDownというイベントを開いてみよう。すると入力引数が
Pic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
になっている。ここで再びVBのヘルプを見てみよう。ここにShiftに関する説明が出ている。説明には、「Shiftはビットフィールドで、ビット0が…」などと書いてある。これを読んですぐに意味のわかる初心者の人は初心者ではない。
シフトの変数型はInteger型であるからして、サイズは2バイトである。ということは16進数では4桁、2進数では16ビットで表される。
2進数でものを考えるときに一番右の数字をビット0と呼ぶ。そこから左に向かってビット1、2となっていって、一番左端の数字はビット15になる。
例えば、Altキーが押されていた場合は
Shift = 0000 0000 0000 0100 = 4
になり、Alt+Shiftであれば
Shift = 0000 0000 0000 0101 = 9
という値が入っている。
Altキーが押されていたかどうか調べたい場合には
というコードでも良い。しかし、AltもしくはCtrlのどちらかが押されていた場合という条件で調べたい場合には
if ((Shift = 4) Or (Shift = 2) Or (Shift = 6))
という条件式にしなければならない。6というのはAlt+Ctrlの場合である。ところがこんなときにAnd演算を使うと便利なのだ。この場合はAltキーのビットとCtrlキーのビットを1にして考える。2進数では0000 0000 0000 0110だから、16進数では&H06である。したがって
とコードを書くことによって、判定することができる。また、ここではビット3~15までは未使用で0が入っている。ところが物によっては0という数値が保証されていない場合がある。そんな場合の備えのためにも、Shift=4などと直接数値を調べるよりも、And演算で必要のないビットを消して(マスクする)調べた方が確実なのだ。
それでは次回はいよいよ3次元でコースが表示されるのである。
|