2012/06/01

C言語 ビットフィールド bitfield

ビットフィールド(bitfield)を使うことでメモリ領域を任意のビットで扱うことができる。方法は構造体とほとんど同じ。基本となる型はintかunsignedを使う。下の例ではunsignedをC言語にはない1ビットのbooleanとして扱ってみる。つまり下位1ビットしか扱わないので、0か1しか扱えなくなる。

ビットフィールド

#include <stdio.h>
struct{
   unsigned boolean: 1;
}Boolean;

int main(void){
   Boolean.boolean;
   int i;
   for(i=0; i<10; i++){
     Boolean.boolean = i;
     printf("%d = %d\n",i, Boolean.boolean);
   }
   return 0;
}
structでビットフィールドを宣言する。「unsigned boolean: 1」の「1」は1ビットのこと。このビットフィールドbooleanに10進数を0から9まで入れていって、表示させてみると以下のようになる。
0 = 0
1 = 1
2 = 0
3 = 1
4 = 0
5 = 1
6 = 0
7 = 1
8 = 0
9 = 1


ビットフィールド

また上記の宣言部分をunsignedではなくintにすると、プラスマイナスを扱うようになるので、1ビットの場合は0か-1というかたちになる。
#include <stdio.h>
struct{
   int boolean: 1;
}Boolean;

int main(void){
   Boolean.boolean;
   int i;
   for(i=0; i<10; i++){
     Boolean.boolean = i;
     printf("%d = %d\n",i, Boolean.boolean);
   }
   return 0;
}
0 = 0
1 = -1
2 = 0
3 = -1
4 = 0
5 = -1
6 = 0
7 = -1
8 = 0
9 = -1


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら