サイトについて      連絡先   検索

VBA ビット演算

はじめに

Excel VBA のビット演算やビットシフトの方法を紹介します。

ビット演算とは、数値を2進数で考え各桁に対して論理演算することです。

各桁に意味を持たせ、それを組み合わせたり取得するのに使用します。プログラミングに慣れていない方にはわかりづらく、使う機会もほとんどないと思います。

2進数とは

2進数とは 0 と 1 だけで数値を表したものです。

1

各桁が 0 なら 0。1 なら 1, 2, 4, 8・・・のように桁が増えるごとに 2 の倍数で繰り上がっていきます。

ビット演算

ビット演算とは論理演算子を数値に対して行うことです。数値を2進数で考えて、各桁ごとに 0 を False、1 を True として処理をすることです。

演算子 演算名 使用例 結果
And論理積1 And 1
1 And 0
0 And 0
1
0
0
Or論理和1 Or 1
1 Or 0
0 Or 0
1
1
0
Not論理否定Not 1
Not 0
0
1
Xor排他的論理和1 Xor 1
1 Xor 0
0 Xor 0
0
1
0

簡単な例を次のコードで紹介します。

Const Red As Integer = 1   ' 001
Const Green As Integer = 2 ' 010
Const Blue As Integer = 4  ' 100

Const Black As Integer = 0 ' 000
Const White As Integer = 7 ' 111

Dim color1 As Integer
color1 = White And Red ' 111 And 001
Debug.Print (color1) ' 1 (001)

Dim color2 As Integer
color2 = Black Or Green ' 000 Or 010
Debug.Print (color2) ' 2 (010)

このように桁の単位に True False の論理演算が行われています。この各桁をフラグと呼びます。

フラグを立てる

フラグを立てるにはそのフラグと Or 演算子します。Or は 1 なら必ず 1 になるため、変数にどんな値が入っていても必ずそのフラグを立てられます。

Const Red As Integer = 1   ' 001
Const Green As Integer = 2 ' 010
Const Blue As Integer = 4  ' 100

' Red フラグを立てる
Dim color As Integer
color = color Or Red   ' 000 Or 001
Debug.Print (color)    ' 1 (001)

' Green フラグを立てる
color = color Or Green ' 001 Or 010
Debug.Print (color)    ' 3 (011)

' Blue フラグを立てる
color = color Or Blue  ' 011 Or 100
Debug.Print (color)    ' 7 (111)

フラグを取得する

フラグを取得するにはそのフラグと And 演算子します。And は 1 と 1 のときだけ 1 になるため、変数にそのフラグが入っているときだけ値を取得できます。

Const Red As Integer = 1   ' 001
Const Green As Integer = 2 ' 010
Const Blue As Integer = 4  ' 100

Const Yellow As Integer = 3 ' 011

' Red フラグを取得する
Dim color As Integer
color = Yellow And Red   ' 011 And 001
Debug.Print (color)    ' 1 (001)

' Green フラグを取得する
color = Yellow And Green ' 011 And 010
Debug.Print (color)    ' 2 (010)

' Blue フラグを取得する
color = Yellow And Blue  ' 011 And 100
Debug.Print (color)    ' 0 (000)、0 はフラグが立っていない

フラグを下ろす

フラグを下ろすにはそのフラグを反転させてから And 演算子します。反転させると 001 は 110 になります。そのフラグだけ 0 になり、それ以外は 1 なので And でフラグだけ 0 にできます。

Const Red As Integer = 1   ' 001
Const Green As Integer = 2 ' 010
Const Blue As Integer = 4  ' 100

Const White As Integer = 7 ' 111

' Red フラグを下ろす
Dim color As Integer
color = White And Not Red   ' 111 And 110
Debug.Print (color)    ' 6 (110)

' Green フラグを下ろす
color = White And Not Green ' 111 And 101
Debug.Print (color)    ' 5 (101)

' Blue フラグを下ろす
color = White And Not Blue  ' 111 And 011
Debug.Print (color)    ' 3 (011)

ビットシフト

ビットシフトとは各桁の状態を 1 桁左や右にずらすことです。VBA にはそのような演算子はありませんが次のようにしてできます。

左シフト

左にシフトするには値 * (2 ^ 桁数)のようにします。桁数に指定した値だけずれます。^ はべき乗です。かっこはわかりやすいように付けています。

Const Three As Long = 3 ' 00000011
Dim bit As Long

bit = Three * (2 ^ 1)
Debug.Print (bit) '  6 (00000110)

bit = Three * (2 ^ 2)
Debug.Print (bit) ' 12 (00001100)

bit = Three * (2 ^ 3)
Debug.Print (bit) ' 24 (00011000)

右シフト

右にシフトするには値 \ (2 ^ 桁数)のようにします。桁数に指定した値だけずれます。。かっこはわかりやすいように付けています。

Const Twentyfour As Long = 24 ' 000011000
Dim bit As Long

bit = Twentyfour \ (2 ^ 1)
Debug.Print (bit) ' 12 (00001100)

bit = Twentyfour \ (2 ^ 2)
Debug.Print (bit) '  6 (00000110)

bit = Twentyfour \ (2 ^ 3)
Debug.Print (bit) '  3 (00000011)

どちらの場合でも数値型の範囲を超えるオーバーフローには注意してください。

関連ページ