ビットフラグ
| 日本語 | 微旗 |
| 英語 | 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();
}
}




