ビット演算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 );

}