ビット演算
基本
今回は息抜きに、ビット演算を解説します。
ビット演算とは、変数のビットを直接操作することです。
たとえば、Byte型なら0~7ビットそれぞれのビットがONかOFFかで、データをあらわしています。
数値 | ビット |
0 | 00000000 |
1 | 00000001 |
2 | 00000010 |
3 | 00000011 |
4 | 00000100 |
このように00000000から11111111の256通り(符号なしで0から255、符号付きで-128から127)の数値を表現できます。
ビット演算子
演算子 | 意味 |
---|
AND | 論理積 |
OR | 論理和 |
NOT | 論理否定 |
XOR | 排他的論理和 |
<< | 左ビットシフト |
>> | 右ビットシフト |
ANDは2つのビットがONであれば0以外を返します。
0 AND 0 | 1 |
0 AND 1 | 0 |
1 AND 0 | 0 |
1 AND 1 | 0 |
ORは2つのビットどちらかがONであれば0以外をを返します。
0 OR 0 | 0 |
0 OR 1 | 1 |
1 OR 0 | 1 |
1 OR 1 | 1 |
NOTはビットを反転します。
XORは片方のビットが1であれば0以外をを返します。
0 XOR 0 | 0 |
0 XOR 1 | 1 |
1 XOR 0 | 1 |
1 XOR 1 | 0 |
ビットシフトは、ビットをずらします。ずれたところは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...になっているから、それぞれのビットは以下のようになります。
1 | 00000001 |
2 | 00000010 |
4 | 00000100 |
8 | 00001000 |
16 | 00010000 |
32 | 00100000 |
64 | 01000000 |
128 | 10000000 |
これらの値でAND演算を行うということは、
例えば10 AND 8のとき、
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ビットでも同じです。