ビットフラグ
日本語 | 微旗 |
英語 | bit flag |
ふりがな | びっとふらぐ |
フリガナ | ビットフラグ |
1ビット単位のフラグ。
整数値の各ビットをフラグに見立てたもの。
通常はint型変数を使用し、その32ビットの1ビットずつに意味を持たせる。例えば右端のビットは「1であれば赤にする」、右端から2番目のビットは「1であれば青にする」等。
それぞれのビットは独立しており、同時にビットを1にすることができる。前述の例で両ビットとも1にすれば「赤にし、青にもする(紫にする?)」というように、2つのフラグを組み合わせた値となっている。
ビットフラグの操作には&演算子、|演算子、^演算子を使用する。これらの演算子はビット単位での論理演算を行うことができる。
ビットフラグそのものは、16進数を元に計算して作る。基本的に1、2、4、8が右端からの各ビットのみを立てる値であり、これらによってビットフラグを作る。そのためにも、16進数から2進数をイメージできるのが望ましい。
ただし、ビットフラグは整数値を使用し、その各ビットをフラグと「みなす」ものであり、ある意味、整数値のイレギュラーな使用方法である。
もしこの整数値を誤って、本当に整数値として使用してしまえば、それだけで値が変わってしまう。
「タイプセーフenum」といった安全なフラグもあるため、使用できるのであればそちらの方がよいだろう。
整数値の各ビットをフラグに見立てたもの。
通常はint型変数を使用し、その32ビットの1ビットずつに意味を持たせる。例えば右端のビットは「1であれば赤にする」、右端から2番目のビットは「1であれば青にする」等。
それぞれのビットは独立しており、同時にビットを1にすることができる。前述の例で両ビットとも1にすれば「赤にし、青にもする(紫にする?)」というように、2つのフラグを組み合わせた値となっている。
ビットフラグの操作には&演算子、|演算子、^演算子を使用する。これらの演算子はビット単位での論理演算を行うことができる。
ビットフラグそのものは、16進数を元に計算して作る。基本的に1、2、4、8が右端からの各ビットのみを立てる値であり、これらによってビットフラグを作る。そのためにも、16進数から2進数をイメージできるのが望ましい。
ただし、ビットフラグは整数値を使用し、その各ビットをフラグと「みなす」ものであり、ある意味、整数値のイレギュラーな使用方法である。
もしこの整数値を誤って、本当に整数値として使用してしまえば、それだけで値が変わってしまう。
「タイプセーフenum」といった安全なフラグもあるため、使用できるのであればそちらの方がよいだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
/** 右から1ビット目のビットフラグ。 */
private static final int RED = 0x1;
/** 右から2ビット目のビットフラグ。 */
private static final int BLUE = 0x2;
public static void main( String[] args )
{
// ビットフラグをそのまま出力します。
System.out.println( getIntBit( RED ) );
System.out.println( getIntBit( BLUE ) );
// 00000000000000000000000000000001
// 00000000000000000000000000000010
// ビットフラグひとつだけセットするなら
// 普通に代入すればいいです。
int flag = RED;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000001
// ビットフラグを加える場合には|演算子を使用します。
flag = flag | BLUE;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000011
// 特定のフラグが立っているかどうか調べるときには
// &演算子を使用します。
System.out.println( ( flag & BLUE ) != 0 );
// true
// 特定のビットを反転する場合には
// ^演算子を使用します。
flag = flag ^ BLUE;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000001
flag = flag ^ BLUE;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000011
// この^演算子を使用すると、特定のフラグを
// 0にできます。
// ビットフラグは、結局はただの整数値です。
flag = 100;
// なんてしたらもう終わりです。
// そのため、できればタイプセーフenum等を
// 使用しましょう。
}
/**
* int型変数をビット形式で返します。
*/
private static String getIntBit( int i )
{
// int型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( i );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
return strbuf.toString();
}
}
public class Sample
{
/** 右から1ビット目のビットフラグ。 */
private static final int RED = 0x1;
/** 右から2ビット目のビットフラグ。 */
private static final int BLUE = 0x2;
public static void main( String[] args )
{
// ビットフラグをそのまま出力します。
System.out.println( getIntBit( RED ) );
System.out.println( getIntBit( BLUE ) );
// 00000000000000000000000000000001
// 00000000000000000000000000000010
// ビットフラグひとつだけセットするなら
// 普通に代入すればいいです。
int flag = RED;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000001
// ビットフラグを加える場合には|演算子を使用します。
flag = flag | BLUE;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000011
// 特定のフラグが立っているかどうか調べるときには
// &演算子を使用します。
System.out.println( ( flag & BLUE ) != 0 );
// true
// 特定のビットを反転する場合には
// ^演算子を使用します。
flag = flag ^ BLUE;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000001
flag = flag ^ BLUE;
System.out.println( getIntBit( flag ) );
// 00000000000000000000000000000011
// この^演算子を使用すると、特定のフラグを
// 0にできます。
// ビットフラグは、結局はただの整数値です。
flag = 100;
// なんてしたらもう終わりです。
// そのため、できればタイプセーフenum等を
// 使用しましょう。
}
/**
* int型変数をビット形式で返します。
*/
private static String getIntBit( int i )
{
// int型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( i );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
return strbuf.toString();
}
}
// Sample.java public class Sample { /** 右から1ビット目のビットフラグ。 */ private static final int RED = 0x1; /** 右から2ビット目のビットフラグ。 */ private static final int BLUE = 0x2; public static void main( String[] args ) { // ビットフラグをそのまま出力します。 System.out.println( getIntBit( RED ) ); System.out.println( getIntBit( BLUE ) ); // 00000000000000000000000000000001 // 00000000000000000000000000000010 // ビットフラグひとつだけセットするなら // 普通に代入すればいいです。 int flag = RED; System.out.println( getIntBit( flag ) ); // 00000000000000000000000000000001 // ビットフラグを加える場合には|演算子を使用します。 flag = flag | BLUE; System.out.println( getIntBit( flag ) ); // 00000000000000000000000000000011 // 特定のフラグが立っているかどうか調べるときには // &演算子を使用します。 System.out.println( ( flag & BLUE ) != 0 ); // true // 特定のビットを反転する場合には // ^演算子を使用します。 flag = flag ^ BLUE; System.out.println( getIntBit( flag ) ); // 00000000000000000000000000000001 flag = flag ^ BLUE; System.out.println( getIntBit( flag ) ); // 00000000000000000000000000000011 // この^演算子を使用すると、特定のフラグを // 0にできます。 // ビットフラグは、結局はただの整数値です。 flag = 100; // なんてしたらもう終わりです。 // そのため、できればタイプセーフenum等を // 使用しましょう。 } /** * int型変数をビット形式で返します。 */ private static String getIntBit( int i ) { // int型変数をビット形式で文字列化します。 String source = Integer.toBinaryString( i ); // 左0埋めします。 StringBuffer strbuf = new StringBuffer(); for( int iF1 = source.length(); iF1 < 32; ++iF1 ) { strbuf.append( "0" ); } strbuf.append( source ); return strbuf.toString(); } }