ビットシフトえらい!
というか、ビットフィールドって意外につかえないのね。
#include <stdio.h> typedef struct _bitf { unsigned int a:16; unsigned int b:8; unsigned int c:4; unsigned int d:2; unsigned int e:1; unsigned int f:1; } bitf; typedef struct _ubitf { union { bitf b; unsigned int v; } u; } ubitf; int main( void ) { ubitf ub; unsigned int sv = 0; ub.u.v = 0; ub.u.b.a = 0x5678; sv |= 0x5678 << 16; ub.u.b.b = 0x34; sv |= 0x34 << 8; ub.u.b.c = 2; sv |= 2 << 4; ub.u.b.d = 1; sv |= 1 << 2; ub.u.b.e = 1; sv |= 1 << 1; ub.u.b.f = 0; printf("*** size = %d\n",sizeof(ubitf) ); printf("*** v = 0x%08x\n",ub.u.v); printf("*** sv = 0x%08x\n",sv); return 0; }
*** size = 4 *** v = 0x52345678 *** sv = 0x56783426
ビットフィールドを使った方は、ソース中に記述した構造体の並びに並んでないように見える。
#実装依存だから当然なのだけれど。
算術シフトを使った方が、わかりやすい。