ビットの設定、クリア、トグルはどのように行うのですか?
ビットを設定するには、ビットごとのOR演算子(|
)を使います。
number |= 1UL << n;
これは number
の n
番目のビットを設定します。1番目のビットを設定したい場合はn
は0にし、n
番目のビットを設定したい場合はn-1
までを設定します。
1UL << nの昇格は
1UL << n` を評価した後でないと起こりません。 残りのすべての例でも同じことが言えます。
ビットをクリアするには、ビットごとのAND演算子(&
)を使います。
number &= ~(1UL << n);
これで number
の n
番目のビットがクリアされます。ビット文字列をビットごとのNOT演算子(~
)で反転させてから、ANDする必要があります。
XOR演算子(^
)を使ってビットをトグルすることができます。
number ^= 1UL << n;
これは number
の n
番目のビットをトグルします。
求められていませんでしたが、追加した方がいいかもしれません。
ビットをチェックするには、数値nを右にシフトして、ビットワイズANDします。
bit = (number >> n) & 1U;
これにより、number
のn
番目のビットの値が変数bit
に入ります。
n番目のビットをxに変更します。
n番目のビットを
1または
0`に設定することは、2の補数C++の実装では以下のようにして実現できます。
number ^= (-x ^ number) & (1UL << n);
ビット n
は x
が 1
のときにセットされ,x
が 0
のときにクリアされます. xが他の値を持つ場合、ゴミが出ます。 x = !!x
はそれを 0 か 1 にブーリアン変換します。
これを2の補数の否定の振る舞い(1の補数や符号/大きさのC++の実装とは異なり、-1
はすべてのビットがセットされます)とは独立させるために、符号なしの否定を使用します。
number ^= (-(unsigned long)x ^ number) & (1UL << n);
または
unsigned long newbit = !!x; // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);
一般的に、ポータブルなビット操作には、符号なしの型を使用するのがよいでしょう。
または
number = (number & ~(1UL << n)) | (x << n);
(number & ~(1UL << n))
は n
番目のビットをクリアし、(x << n)
は n
番目のビットに x
を設定します。
また、一般的にコードをコピー&ペーストしない方が良いとされているので、多くの人がプリプロセッサマクロ(コミュニティwikiの回答をさらに下にのようなもの)やある種のカプセル化を使用しています。
ビットに*名前をつけるためにenum
を使うことが価値ある場合もあります。
enum ThingFlags = {
ThingMask = 0x0000,
ThingFlag0 = 1 << 0,
ThingFlag1 = 1 << 1,
ThingError = 1 << 8,
}
そして、後でその名前を使用します。例えば、次のように書きます。
thingstate |= ThingFlag1;
thingstate &= ~ThingFlag0;
if (thing & ThingError) {...}
と書いて、セット、クリア、テストを行います。こうすることで、マジックナンバーを他のコードから隠すことができます。
それ以外はJeremyのソリューションを支持します。