ビットシフトえらい!

というか、ビットフィールドって意外につかえないのね。

#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

ビットフィールドを使った方は、ソース中に記述した構造体の並びに並んでないように見える。

実装依存だから当然なのだけれど。

算術シフトを使った方が、わかりやすい。