ビット演算

基本

今回は息抜きに、ビット演算を解説します。
ビット演算とは、変数のビットを直接操作することです。
たとえば、Byte型なら0~7ビットそれぞれのビットがONかOFFかで、データをあらわしています。
数値ビット
000000000
100000001
200000010
300000011
400000100
このように00000000から11111111の256通り(符号なしで0から255、符号付きで-128から127)の数値を表現できます。

ビット演算子

演算子意味
AND論理積
OR論理和
NOT論理否定
XOR排他的論理和
<<左ビットシフト
>>右ビットシフト
ANDは2つのビットがONであれば0以外を返します。
0 AND 01
0 AND 10
1 AND 00
1 AND 10
ORは2つのビットどちらかがONであれば0以外をを返します。
0 OR 00
0 OR 11
1 OR 01
1 OR 11
NOTはビットを反転します。
NOT 01
NOT 10
XORは片方のビットが1であれば0以外をを返します。
0 XOR 00
0 XOR 11
1 XOR 01
1 XOR 10
ビットシフトは、ビットをずらします。ずれたところは0が入ります。
変数 << ビット数

確かめる

以下のプログラムでビット演算子を使った実験をしてみましょう。
#console
#include<vcrt71.sbp>
Dim x As Byte
Dim b As Long
For x=0 To 10 
    printf("%3d:" , x)
    For b = 7 To 0 Step -1
        If x And Int(pow(2 , b)) Then
            printf("1")
        Else
            printf("0")
        End If
    Next
    printf(Ex"\n")
Next
実行結果はこうなります。
  0:00000000
  1:00000001
  2:00000010
  3:00000011
  4:00000100
  5:00000101
  6:00000110
  7:00000111
  8:00001000
  9:00001001
 10:00001010
どうしてx And Int(pow(2,b))でビットを知ることができるのか解説しておきます。
Int(pow(2,b))の値が1,2,4,8...になっているから、それぞれのビットは以下のようになります。
100000001
200000010
400000100
800001000
1600010000
3200100000
6401000000
12810000000
これらの値でAND演算を行うということは、
例えば10 AND 8のとき、
    10 : 00001010 
and  8 : 00001000 
----------------- 
     8 : 00001000 
8、つまり4ビット目が存在するという結果になります。

ビット出し入れ

簡単なビット操作関数を作ってみましょう。
今度はビットシフトも使っています。
#console
#include<vcrt71.sbp>

'xのiビット目を調べる
Function GetBit(x As Long ,i As Long ) As Long
    GetBit = (x And 1<<i)
End Function

'xのiビット目にデータを入れる
Function PutBit(x As Long ,i As Long ) As Long
    PutBit = (x Or 1<<i)
End Function

'テスト
Dim a As Long
a = 0'初期化
a = PutBit(a , 4)
printf(Ex"a = %d\n" , a)
ビットシフトの使い方は、この例で分かると思います。
1<<1で2(00000001 が 00000010)に、
1<<3で8(00000001 が 00001000)に、なります。
上の例は8ビットですが16ビットでも同じです。