C でのビットフィールド操作

ビットフィールドは、「C は機械語内のフィールドの順序付けを保証しない」(The C book) ため、思ったほど移植性が高くありません。

それを無視して、正しく使用しました 、どちらの方法でも安全です。どちらの方法でも、整数変数へのシンボリック アクセスが可能です。ビットフィールド メソッドの方が書きやすいと主張できますが、レビューするコードが増えることも意味します。


ビットの設定とクリアでエラーが発生しやすいという問題がある場合は、関数またはマクロを作成して正しく実行することをお勧めします。

// off the top of my head
#define SET_BIT(val, bitIndex) val |= (1 << bitIndex)
#define CLEAR_BIT(val, bitIndex) val &= ~(1 << bitIndex)
#define TOGGLE_BIT(val, bitIndex) val ^= (1 << bitIndex)
#define BIT_IS_SET(val, bitIndex) (val & (1 << bitIndex)) 

BIT_IS_SET を除いて、val が左辺値でなければならないことを気にしないのであれば、コードが読みやすくなります。それでも満足できない場合は、代入を取り出して括弧で囲み、val =SET_BIT(val, someIndex); として使用します。

実際、その答えは、やりたいこととやりたいことを分離することを検討することです。


ビットフィールドは読みやすく優れていますが、残念ながらC 言語はメモリ内のビットフィールドのレイアウトを指定していません。 つまり、ディスク上のフォーマットやバイナリ ワイヤ プロトコルでパックされたデータを処理するのには、基本的に役に立ちません。私に言わせれば、この決定は C の設計上の誤りでした — Ritchie は注文を選んでそのままにしておくことができたはずです。