C ビットフィールド 新しいページはコチラ
提供: yonewiki
(→ビットフィールド) |
(→ビットフィールド) |
||
10行: | 10行: | ||
具体的には以下のようにして、ビットフィールドを利用した変数を定義できます。 | 具体的には以下のようにして、ビットフィールドを利用した変数を定義できます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | struct stBFBool{ | ||
+ | unsigned int bf1_aflag :1; | ||
+ | unsigned int bf1_bflag :1; | ||
+ | unsigned int bf1_cflag :1; | ||
+ | unsigned int bf1_dflag :1; | ||
+ | unsigned int bf1_eflag :1; | ||
+ | unsigned int bf1_fflag :1; | ||
+ | unsigned int bf1_gflag :1; | ||
+ | … | ||
+ | unsigned int bf1_xflag :1; | ||
+ | unsigned int bf1_yflag :1; | ||
+ | unsigned int bf1_zflag :1; | ||
+ | }; | ||
+ | </syntaxhighlight> | ||
+ | 上記のビットフィールドにより26bitで26個の1bitのunsigned int型の変数を定義できることになります。bool型のように扱えるだけであってbool型ではないです。bool型は1Byteの変数で0を偽、0以外になるすべての値を真とするものです。ここでは、1bitの符号無しintの1ビット長で0を偽、1を真とし、それ以外の値を代入しようとするとオーバフローする型です。また、ビットフィールドという手法を使っているため、アドレスの参照ができないという制限があります。ポインタでの操作はできないと考えてよいと思います。これらの制限とメリットのどちらが得かを考えて利用する必要があります。 | ||
+ | |||
+ | |||
+ | ビットフィールドには他にも制限があり、int型より大きいサイズのbit数の指定はできません。したがって、 | ||
+ | |||
+ | unsigned int bf1_yflag :33; | ||
+ | |||
+ | としても、32までしか使えないため、指定を無視して32bitに切り詰められます。 | ||
+ | |||
+ | bit値がint型のしきりをまたぐような大きさでは確保できません。例えば | ||
+ | |||
+ | unsigned int bf1_xflag :24; | ||
+ | unsigned int bf1_yflag :24; | ||
+ | unsigned int bf1_zflag :24; | ||
+ | unsigned int bf1_aaflag :24; | ||
+ | |||
+ | とすると、1変数あたりで32-24=8で8ビットずつがあまるので、4つあつまると1byte節約できるようにも感じますが、実際には、int型の大きさをまたいでbit値を確保できないために詰めることができず、節約にはなりません。 | ||
+ | |||
+ | |||
+ | あえて、節約しない方法もあります。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | struct stBFBool{ | ||
+ | unsigned int bf1_aflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_bflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_cflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_dflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_eflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_fflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_gflag :1; | ||
+ | unsigned int :0; | ||
+ | … | ||
+ | unsigned int bf1_xflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_yflag :1; | ||
+ | unsigned int :0; | ||
+ | unsigned int bf1_zflag :1; | ||
+ | unsigned int :0; | ||
+ | }; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 上記のようにビットフィールド値に0を指定すると、次のint型の区切りまでビットフィールドの確保開始位置をシフトします。1bitの変数ですが、4Byteのメモリサイズを使うようにふるまいます。 |