1bit のメンバー変数に正の数を代入すると丸め込んでいると思い込んでいました。
が、その考えは間違いでして、 1bit フィールドには 1 or 0 しか入れちゃダメみたいです。
以下、 HOGE_FLAG(0x8) のマスクを取ってフラグがたっているか確認を行うソースコードです。
r2.a には 0x08 が代入されるので、 丸め込まれて r2.a は 1 になるのかなと思っていたのですが、実際には 0 が入っていました。
#define HOGE_FLAG 0x8
int main(void) {
int r;
struct {
unsigned int a:1;
} r2;
int num = 0x0e;
r = num & HOGE_FLAG;
r2.a = num & HOGE_FLAG;
printf("r:%d r2.a:%d\n", r, r2.a);
return 0;
}
結果
r:8 r2.a:0
r2.a= (num & HOGE_FLAG)? 1 : 0; と書いて解決できます。