C/C++

ビットフィールド

更新日:

ビットフィールドとは

あまり使われず、多くの参考書にも載っていないので、あまり重要な項目ではありませんが、ここではビットフィールドについて解説します。

ビットフィールドは、データのサイズをビット単位で扱うことが出来ます。
例えば、サイズが1ビットの変数を用意できます。
1ビットということは0か1しか値を持ちません。
これは論理値型のフラグとしてつかえます。

また、共用体のメンバとして使うことで、指定した部分をとりだすことができます。

使い方

ビットフィールドは構造体のメンバとして定義します。
以下のように書きます。

【変数型】 【メンバ名】:【ビット数】


これで定義したメンバは、指定したビット数で格納されます。
厳密には、宣言した変数型分のメモリ領域を確保しますが、使えるのは指定したビット数分です。

変数型には主にint、unsigned intが使われます。

連続でビットフィールドを宣言すると、前のビットフィールドに続いて領域を確保します。

サンプルコード

bitfield_sample1.c

#include <stdio.h>

struct str
{
	unsigned int a : 1;
};

int main(void)
{
	struct str s;
	s.a = 3;

	printf("%d", s.a);

	return 0;
}

このサンプルコードでは1ビットのビットフィールドのみを定義しています。
その1ビットの領域に3を代入していますが、結果は1と表示されます。
これは、1ビットのビットフィールドなので2ビット目以降を読まないためです。

bitfield_sample2.c

#include <stdio.h>

struct str
{
	unsigned int a0 : 1;
	unsigned int a1 : 1;
	unsigned int a2 : 1;
	unsigned int a3 : 1;
	unsigned int a4 : 1;
	unsigned int a5 : 1;
	unsigned int a6 : 1;
	unsigned int a7 : 1;
};

union chr
{
	char c;
	struct str a;
};

int main(void)
{
	union chr c;
	c.c = 'a';

	printf("%d", c.a.a7);
	printf("%d", c.a.a6);
	printf("%d", c.a.a5);
	printf("%d", c.a.a4);
	printf("%d", c.a.a3);
	printf("%d", c.a.a2);
	printf("%d", c.a.a1);
	printf("%d", c.a.a0);

	return 0;
}

この例では、8ビットをそれぞれ1ビットずつ分割した構造体を共用体のメンバにしています。
共用体は複数のメンバで領域を共有するので、構造体strはchar型変数cの各ビットを示していることになります。
構造体、共用体についてはこちら。

構造体

共用体



-C/C++

Copyright© ツナのエンジニアブログ , 2025 All Rights Reserved Powered by AFFINGER5.