1. ホーム
  2. c++

[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?

2022-03-15 21:20:02

質問

ビットのセット、クリア、トグルはどのように行うのですか?

どのように解決するのですか?

ビットの設定

ビット単位のOR演算子( | ) を使ってビットを設定します。

number |= 1UL << n;

これで n のビットが number . n を設定する場合は、0にする必要があります。 1 stビットまで n-1 を設定したい場合は n のビットがあります。

使用方法 1ULL もし number よりも広い unsigned long を推進する。 1UL << n を評価した後でないと起こりません。 1UL << n の幅以上ずれるのは未定義の動作です。 long . 残りの例もすべて同様です。

ビットをクリアする

ビット単位のAND演算子( & )でビットをクリアします。

number &= ~(1UL << n);

これで n のビットが number . ビット列は、ビット演算子 NOT で反転させる必要があります ( ~ )、ANDにします。

ちょっとトグル

XOR演算子( ^ ) を使ってビットを切り替えることができます。

number ^= 1UL << n;

これで n のビット number .

ちょっとだけ確認

あなたはこれを要求しませんでしたが、私はそれを追加することがあります。

ビットのチェックは、数値nを右にシフトして、ビット単位でANDします。

bit = (number >> n) & 1U;

これによって n のビットが number を変数 bit .

を変更する n ビットを x

設定する n ビットを 1 または 0 は、2の補数C++の実装では、以下のように実現できます。

number ^= (-x ^ number) & (1UL << n);

ビット n がセットされます。 x1 の場合、クリアされます。 x0 . もし x が他の値を持っている場合は、ゴミになります。 x = !!x は0か1にブーリアン化します。

2の補数否定の動作に依存しないようにするため(ここで -1 は、1の補数や符号/倍数C++の実装とは異なり、すべてのビットが設定されています)、符号なし否定を使用してください。

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の回答では、さらに下の ) やカプセル化のようなものがあります。