C#・VBでは言語組み込みのビットごとの演算として、以下のビット演算子が用意されています。 整数型に対して使用することで、ビットごとの演算を行うことができます。 &=
などのように、ビット演算子に=
を後置できる演算子では、代入先を左オペランド(左項)とする複合代入演算子となります。
ビット演算 | 演算子 | |
---|---|---|
C# | VB | |
論理否定(NOT)・1の補数 |
~
|
Not
|
論理積(AND) |
& , &= |
And
|
論理和(OR) |
| , |= |
Or
|
排他的論理和(XOR) |
^ , ^= |
Xor
|
VBにおけるビット演算子は、Char
を除く各整数型に対して使用できます。 演算の結果は、左右のオペランド(項)が同じ型の場合はその型、異なる型の場合はより大きい型の方に拡大変換されます。
NOT・AND・OR・XORの各演算子を使ってビット演算を行う
Imports System
Module Sample
Sub Main()
Dim x As Integer = &H_55AA_00FF
Dim y As Integer = &H_5A5A_0F0F
Dim not_x As Integer = Not x ' NOT(論理否定)
Dim x_or_y As Integer = x Or y ' OR(論理和)
Dim x_and_y As Integer = x And y ' AND(論理積)
Dim x_xor_y As Integer = x Xor y ' XOR(排他的論理和)
Console.WriteLine("Not {0} = {1}", x.ToBinary(), not_x.ToBinary())
Console.WriteLine("{0} Or {1} = {2}", x.ToBinary(), y.ToBinary(), x_or_y.ToBinary())
Console.WriteLine("{0} And {1} = {2}", x.ToBinary(), y.ToBinary(), x_and_y.ToBinary())
Console.WriteLine("{0} Xor {1} = {2}", x.ToBinary(), y.ToBinary(), x_xor_y.ToBinary())
End Sub
#Region "数値を二進数表記の文字列化するためのメソッド"
<System.Runtime.CompilerServices.Extension> _
Function ToBinary(ByVal number As Integer) As String
Return "&B_" + Convert.ToString(number, 2).PadLeft(8 * Len(number), "0"c)
End Function
#End Region
End Module
実行結果
Not &B_01010101101010100000000011111111 = &B_10101010010101011111111100000000 &B_01010101101010100000000011111111 Or &B_01011010010110100000111100001111 = &B_01011111111110100000111111111111 &B_01010101101010100000000011111111 And &B_01011010010110100000111100001111 = &B_01010000000010100000000000001111 &B_01010101101010100000000011111111 Xor &B_01011010010110100000111100001111 = &B_00001111111100000000111111110000
上記の演算子をbool
・Boolean
に対して使用すると、ビットごとの演算ではなく単一のブール値に対する演算を行う論理演算子となります。 ただしVBでは、ブール値に対して論理積・論理和を求める場合は通常AndAlso
・OrElse
演算子を使います 詳細は論理演算子 §.AndAlso演算子・OrElse演算子を参照してください。
ビット演算子はFlags属性を持つ列挙体に対しても使用することができます。 (列挙体とフラグ)