月刊プログラム!
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



AND演算の例

今更言う程のもんではないですが、真は1、偽は0です。
VBエディタを開いてもらい、イミディエイトウィンドウ内に下の様な式を打ってください。

イミディエイトウィンドウ1
イミディエイトウィンドウ2

? 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」で比較をします。


おしまい

ちょっと今回はダラダラとした文章になってしまいましたね。。。
プログラムとは、本当は楽しいもので、楽しんでやらないと損です。
しかし楽しんでやるには、こういった知識も必要となってきます。

次回は今までとはちょっと趣向を変え、レベルを上げたものをやっていこうと思います。(いつも書いてる気がするなー)