ビット演算3種類
複数ビットを監視したい場合はビット演算を用います。たとえばパソコンのPCI-Expressバスなどにデジタル入出力ボードをセットし、プログラマブルコントローラと複数ビットで通信する場合に有用なテクニックです。
主に OR と AND と XOR と NOT を使います。
このコードは、ORを使って下位4ビットをむりやりたてる方法です。
private void menuDebugExec000_Click( object sender, EventArgs e )
{
// 0101-0101.
byte value = 0x55;
// 下位4ビットをむりやりたてる.
byte mask = 0x0f;
value |= mask;
// 0101-0101 in.
// 0000-1111 mask.
// ---------------
// 0101-1111 out.
String str = String.Format( "0x{0:x2}", value );
MessageBox.Show( str );
}
このコードは、ANDをつかって上位4ビットをおとす方法です。
private void menuDebugExec001_Click( object sender, EventArgs e )
{
// 0101-0101.
byte value = 0x55;
// 上位4ビットをおとす.(下位4bitはそのまま通過).
byte mask = 0x0f;
value &= mask;
// 0101-0101 in.
// 0000-1111 mask.
// ---------------
// 0000-0101 out.
String str = String.Format( "0x{0:x2}", value );
MessageBox.Show( str );
}
このコードは、XORを使って下位4ビットだけを反転させる方法です。
private void menuDebugExec002_Click( object sender, EventArgs e )
{
// 0101-0101.
byte value = 0x55;
// 下位4ビットだけを反転させる.
byte mask = 0x0f;
value ^= mask;
// 0101-0101 in.
// 0000-1111 mask.
// ---------------
// 0101-1010 out.
String str = String.Format( "0x{0:x2}", value );
MessageBox.Show( str );
}
本記事は「ビット演算3種類」としております。ビットマスクを使った演算方法は上記の3種類ですが、そもそも所望のビットマスクを得るのにビットならびごとの NOT を活用する場合があります。
このコードは、ビットごとの NOT を使ってビットならびをすべて反転する方法です。
private void menuDebugExec003_Click( object sender, EventArgs e )
{
// 0101-0101.
byte mask0 = 0x55;
byte mask1 = 0x00;
// すべてのビットを反転させる.
mask1 = (byte)( ~mask0 );
// 0101-0101 mask0.
// 1010-1010 mask1.
String str = String.Format( "0x{0:x2}", mask1 );
MessageBox.Show( str );
}