月刊プログラム!
Visual Basic For Excel
Vol_19
2002.May.09
Presented by kouta_y
感想等は掲示板、苦情はメールへ。
最近本気で月イチ更新になってきました。
これでは「メインコンテンツです」とは大見得きって言えないなあ。
ビット演算してみる
ビットとは、2進数の事です。
2進数とは、0と1のみで数値を表現する方法の事です。
普通に日常で使っているのは、10進数とよばれるものです。
10進数は数値を0〜9まで使って表現しますが、2進数は0〜1の2つだけなんです。
0〜9までだと、0・1・2・3・・・と数えていって、値が9を超えると「10」と桁が上がります。
対して0〜1までだと、0・1といって、その次が「10」となります。しかし実際の値は10進数でいう「2」になります。
桁の上がり方が違うだけで、真の値はその通りではありません。
しかし「1100」とかいう数字を見ただけでは2進数なのか10進数なのか見分けが付きません。
なので「1100(2)」という様に、括弧をつけて「この数字は2進数ですよー」と表現する方法もあります。
上位・下位ビットって?
この辺りはどっちかと言うとハードの知識に近いのですが、、、
「上位ビット」というのは、分かりやすく言うと「位が上」のビットの事を指します。「下位ビット」はその逆です。
つまり、
←上位 下位→
1001 0101 0101 0110
こういう事です。
ちなみに「上位ビット」と言っただけでは「どこから、どこまでが上位?」となってしまいます。
人に説明する時などは「上位4ビット」などビット数も付けてあげます。
赤字の部分が「上位4ビット」となります。
←上位 下位→
1001 0101 0101 0110
あと「上位」と「下位」それぞれ「MSB」と「LSB」という言い方もします。
MSB → Most Significant Bit(上位ビット)
LSB → Least Significant Bit(下位ビット)
2進数での計算方法は10進数と全く同じです。
ただ桁の上がり方が違うので、最初はそれに惑わされるかもしれませんが、慣れれば見ただけで「128!」とか言える様になります。
2・10・16進数の対応表
2進数 | 10進数 | 16進数 |
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
0 1 2 3 4 5 6 7 8 9 A B C D E F |
他にもあまり使いませんが、8進数というのもあります。
だらだらした長い説明ですみません。
1バイトって何ビット?
はい。これは俺もずっと疑問に思ってきました。
答えを先に言うと、1バイトは「8ビット」になります。
何故「8」なのかはよく分かりませんが、ほとんどのハードは「1バイト=8ビット」という仕様になっている為そう決まってきるのかもしれません。
ちなみに「8進数」はバイト計算の為にあります。
実際使う時はどうなんよ
頭でっかちの知識だけ詰め込んでは、学校の授業を寝て聞いてる人と大差ありません。
とりあえず「ビット演算」を実践してみましょう。
ビット演算とは、上で説明した2進数の0と1を比較し、0か1かの結果を出力(?)する事を言います。
代表的な演算方法は、AND演算(論理積)、OR演算(論理和)、XOR演算(排他的論理和)といったところです。
他にもありますが、この3つだけ知ってれば十分でしょう。
AND演算 | ||
式1 | 式2 | 結果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
OR演算 | ||
式1 | 式2 | 結果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
XOR演算 | ||
式1 | 式2 | 結果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
? 6 And 10 |
2 |
「6と10で何故2???」
全く関係ない結果が出たようにみえますが、これをビットごとに演算してみましょう。
式1 0110 式2 1010 -------- 結果 0010 |
6(10) 10(10) 2(10) |
まず最下位ビットを見てみます。
比較対象は両とも0の為、結果は0となります。
0 And 0 = 0
2ビット目は、両方とも1なので、結果は1となります。
1 And 1 = 1
他のビットも同じように計算します。
すると結果は2となります。
だから実際どういう時に使うの!
はい。そうですね。
よく使うのは、「このビットを1にしたい時」や逆に「0にしたい時」に使います。
例えば「MsgBox」という関数があります。
このMsgBox関数を、
こんな風に表示させるには、「vbYesNoCancel」と「vbInformation」という2つのスタイルを指定しますが、
実はこれ、ビットを指定してるんですね。
「vbYesNoCancel」の真の値は「3」です。
「vbInformation」の真の値は「64」です。
それぞれビット配列にすると、
「0000 0011」
「0100 0000」
となります。
これを「OR演算」する事により、1・2・7ビット目にそれぞれ1を立て、上のようなスタイルで表示します。
ではその逆に、「0にしたい時」はというのは。
例えば「1バイトの内、下位4ビットだけ取り出したい!」とします。
下位4ビットのみ取り出すというのは、
「上位ビットを全て0にする」
という事になります。
ではコードです。
「230」という数値から下位4ビットを取り出します。
イミディエイトウィンドウ内に打ってください。
? 15And 230 |
結果:
6 |
さて何故「6」になるかというと、ビットごとに見てみましょう。
式1 0000 1111 式2 1100 0110 ------------- 結果 0000 0110 |
15(10) 230(10) 6(10) |
上位4ビットを0にするには、0で比較すれば良いのです。
下位4ビットをそのまま取り出すには、1でAND演算をすれば「1のものは1、0のものは0」という結果になる為、すなわち「15」で比較をします。
おしまい
ちょっと今回はダラダラとした文章になってしまいましたね。。。
プログラムとは、本当は楽しいもので、楽しんでやらないと損です。
しかし楽しんでやるには、こういった知識も必要となってきます。
次回は今までとはちょっと趣向を変え、レベルを上げたものをやっていこうと思います。(いつも書いてる気がするなー)