は(~0
を使用しないでください右のサイズですので、のように組み合わせることができる、)常にフルint
ですが、~v.bar
:
v.bar |= ~v.bar; // or,
v.bar ^= ~v.bar;
を行う必要がありますそのトリックはどんなサイズでもあります。
ビットフィールドへの参照をバインドすることはできないので、残念ながら関数内ではうまくラップできません。あなたはそれをFoo&
の関数にするか、マクロを使う必要があります。
PS。私はcoliruで投稿する前にこれをすばやく試して、ローカルでGCC(g ++)5.3.1と6.2.0を再確認しました。-Wall
の診断は発行しません。
PPS。このテストコード付き
、GCCは符号なしのメンバーのための診断を生成します。
struct Foo {
int i : 2;
unsigned int u : 30;
};
void bar() {
Foo f {0, 0};
f.i ^= ~f.i; // OK
f.u |= ~f.u; /* warning:
large integer implicitly truncated to unsigned type [-Woverflow]
*/
}
、私はまた、通常ビットフィールドまたはビット単位の操作のための符号なし整数を好むだろうが、そうはG ++は、int
と幸せと静かですここに。
なぜビットフィールドが必要ですか? (Btw、あなたの構造があまりにもboolとintを含むことになるという保証はありません)。 – StoryTeller
M.b. memset()を使用できますか? – voltento
'v.bar = UINT_MAX;'には何を得ますか? –