Visual Basicでは、整数型に対してAnd
, Or
, Xor
, Not
の各ビット演算子を用いることができます。 また、VB7.1(VB2003)以降では右シフト>>
および左シフト<<
のビットシフト演算子を用いることができます。
ビット演算子
And
, Or
, Xor
, Not
の各演算子は、整数型に対してはビット演算子として動作します。 And
はビットごとの論理積、Or
は論理和、Xor
は排他的論理和、Not
は論理否定となります。
例えば、変数の特定ビットが立っているかを調べるにはAnd
演算子を使って次のようにします。
AndAlso演算子・OrElse演算子をビット演算子として使用することはできません。 常に論理演算子として機能します。
Long型を使うことで最大64ビットの数値を扱うことができますが、それよりも長大なビット値を操作するにはBigInteger型やコレクションの一種であるBitArrayクラスを使用することもできます。
16進数表記・2進数表記
ビット演算に際しては、16進数表記・2進数表記がよく用いられます。 VBでは、プレフィックス&H
を用いることで数値を16進数表記で記述することができます。 また、VB 15(Visual Basic 2017)以降では、プレフィックス&B
を用いることで数値を2進数表記で記述することができます。 これらは、C++やC#におけるプレフィックス0x
・0b
に相当するものです。
さらに、VB 15.5以降では、桁区切り記号としてアンダースコア _
を含めて記述することもできます。
例として、2進数表記とAnd
演算子を使って変数の特定ビットが立っているかを調べるには、次のようにします。
16進数表記・2進数表記や桁区切り記号、またサフィックスによる型を指定した数値表記等についてより詳しくはリテラルとサフィックス §.整数リテラルおよびリテラルとサフィックス §.サフィックスを参照してください。
VBではプレフィックス&O
を用いることで8進数表記にすることもできます。 詳しくはリテラルとサフィックス §.8進整数リテラルを参照してください。
列挙体とビット演算
ビット演算子は列挙体にも使えます。 FileAttributes列挙体などビットごとの組み合わせが可能な列挙体に対して使用することで、値を組み合わせたり、特定の値がセットされているかどうかを調べることができます。
16進数表記・2進数表記での文字列化
値を16進数表記・2進数表記で文字列化するには、ToStringメソッドに書式指定子X
・B
を指定する方法があります。 書式指定子B
は、.NET 8以降で使用できます。
また、Convert.ToStringメソッドを使う方法もあります。
16進数表記・2進数表記での文字列化、基数変換についてより詳しくはビット演算 §.数値・文字列間での基数変換を参照してください。
ビットシフト演算子
VB7.1(VB2003)以降ではビットシフト演算子を使用することができます。 ビットシフト演算子はその名の通り、値のビット表記に対してその表記を右または左にシフトする演算子です。 >>
演算子は算術右シフト、<<
演算子は算術左シフトを行います。
ビットシフト演算子は「値または変数 >> 右シフトの量
」もしくは「値または変数 << 左シフトの量
」のように使用します。 算術的には、nビット右にシフトすることは値を2nで割ることと等しく、nビット左にシフトすることは値に2nを掛けることと等しい演算です。
なお、ビットシフト演算子はその特性上、整数型(Byte, Integer, UInteger, Longなど)に対してのみ使用できます。
また、ビットシフトと代入を同時に行う複合代入演算子も用意されています。
ビットシフト演算子の動作についてより詳しくはビット演算 §.シフト演算子を参照してください。
また、.NET Core 3.0/.NET 5以降では、BitOperations.RotateLeftメソッド・BitOperations.RotateRightメソッドを用いることで回転シフト(循環シフト)を行うこともできます。 これについて詳しくはビット演算 §.左回転シフト・右回転シフト (RotateLeft・RotateRight)にて解説しています。
演算子以外のビット演算
言語組み込みの演算子を使用するほかに、.NETではBitOperationsクラスに用意されているビット演算メソッドを使用することができます。 具体的な使い方や使用できるメソッドについてはビット演算 §.BitOperationsクラスにて解説しています。