C++ のビット演算チュートリアル

バックグラウンド

C++ のビット単位の演算は、バイナリ ビットを操作する演算です。C++ は、ビット単位の and、ビット単位の or、ビット単位の排他的論理和、左シフトと右シフトなどを含む、さまざまなビット単位の演算子をサポートしています。この記事では、C++ でのビット演算子とその使用法を紹介します。

ビット単位の AND (&)

ビット単位の AND 演算子 (&) は、2 つの 2 進数の各ビットの AND を演算するために使用されます。両方の 2 進数の対応するビットが 1 の場合、結果の対応するビットは 1 になり、それ以外の場合は 0 になります。例えば:

unsigned int a = 0b1010; // 10
unsigned int b = 0b1100; // 12
unsigned int c = a & b;  // 0b1000, or 8 in decimal

この例では、変数 a と b はそれぞれ 2 進数 1010 と 1100 を表し、ビットごとの AND 演算の結果は 2 進数 1000、または 10 進数 8 になります。

C++ では、ビットごとの AND 演算子 (&) は、次のようなさまざまなアプリケーション シナリオで使用できます。

2 進数の一部のビットのクリア: ビットごとの AND 演算子を使用して、2 進数の一部のビットを 0 にクリアできます。たとえば、2 進数 10101110 の下位 4 ビットをゼロにするには、次のコードを使用します。

unsigned char a = 0xAE; // 10101110
unsigned char b = 0xF0; // 11110000
unsigned char c = a & b; // 10100000

この例では、変数 a は 2 進数 10101110 を表し、変数 b は 2 進数 11110000 を表し、ビットごとの AND 演算の結果は 2 進数 10100000、または 16 進数 0xA0 になります。

2 進数の一部のビットが 1 であるかどうかを判断する: ビットごとの AND 演算子を使用して、2 進数の一部のビットが 1 であるかどうかを判断できます。たとえば、2 進数 10101110 の 3 番目のビットが 1 であるかどうかを判断するには、次のコードを使用できます。

unsigned char a = 0xAE; // 10101110
unsigned char b = 0x08; // 00001000
bool c = (a & b) != 0;  // true

この例では、変数 a は 2 進数 10101110 を表し、変数 b は 2 進数 00001000 を表し、ビットごとの AND 演算の結果は 2 進数 00001000、または 16 進数 0x08 になります。結果は 0 ではないので、ビット 3 は 1 になります。

ビット単位または (|)

ビットごとの OR 演算子 (|) は、2 つの 2 進数の各ビットの OR を計算するために使用されます。両方の 2 進数の対応するビットが 0 の場合、結果の対応するビットは 0 になり、それ以外の場合は 1 になります。例えば:

unsigned int a = 0b1010; // 10
unsigned int b = 0b1100; // 12
unsigned int c = a | b;  // 0b1110, or 14 in decimal

C++ では、ビットごとの OR 演算子 (|) をさまざまなシナリオで使用できます。
2 進数の一部のビットを設定する: ビットごとの OR 演算子を使用して、2 進数の一部のビットを 1 に設定できます。たとえば、2 進数 10100000 の下位 4 ビットを 1 に設定するには、次のコードを使用します。

unsigned char a = 0xA0; // 10100000
unsigned char b = 0x0F; // 00001111
unsigned char c = a | b; // 10101111

この例では、変数 a は 2 進数 10100000、変数 b は 2 進数 00001111 を表し、ビットごとの OR 演算の結果は 2 進数 10101111、または 16 進数 0xAF になります。

2 つの 2 進数の一部のビットを結合する: ビットごとの OR 演算子を使用して、2 つの 2 進数の一部のビットを結合できます。たとえば、2 進数 10100000 の下位 4 ビットを 2 進数 00001111 の下位 4 ビットに置き換えるには、次のコードを使用します。

unsigned char a = 0xA0; // 10100000
unsigned char b = 0x0F; // 00001111
unsigned char c = (a & 0xF0) | (b & 0x0F); // 10101111

この例では、変数 a は 2 進数 10100000 を表し、変数 b は 2 進数 00001111 を表します。ビットごとの AND 演算子 & を使用して、a の上位 4 ビットと b の下位 4 ビットをそれぞれ抽出し、次を使用します。ビットごとの OR 演算子 | それらを結合すると、2 進数で 10101111、16 進数で 0xAF が得られます。

ビットごとの XOR (^)

ビットごとの XOR 演算子 (^) は、2 つの 2 進数の各ビットの XOR を計算するために使用されます。2 つの 2 進数の対応するビットが同じである場合、結果の対応するビットは 0 になり、そうでない場合は 1 になります。例えば:

unsigned int a = 0b1010; // 10
unsigned int b = 0b1100; // 12
unsigned int c = a ^ b;  // 0b0110, or 6 in decimal

この例では、変数 a と b はそれぞれ 2 進数 1010 と 1100 を表し、ビットごとの XOR 演算の結果は 2 進数 0110、または 10 進数 6 になります。

C++ では、ビット単位の XOR 演算子 (^) を次のようなさまざまなアプリケーション シナリオで使用できます。
暗号化と復号化: ビット単位の XOR 演算子を使用して、データの単純な暗号化と復号化を実行できます。たとえば、文字列 hello を暗号化するには、次のコードを使用できます。

std::string str = "hello";
char key = 'a';
for (int i = 0; i < str.length(); i++) {
    str[i] ^= key;
}

この例では、ビットごとの XOR 演算子 ^ を使用して、文字列 hello の各文字とキー a を XOR することにより、文字列 hello を暗号化します。文字列を復号化するには、暗号化された文字列をもう一度 XOR します。

2 つの変数の値を交換する: ビットごとの AND 演算子を使用して 2 つの変数の値を交換できます。たとえば、変数 a と b の値を交換するには、次のコードを使用できます。

unsigned int a = 123;
unsigned int b = 456;
a ^= b;
b ^= a;
a ^= b;

この例では、ビットごとの XOR 演算子 ^ を使用して、変数 a と b の値を交換します。まず、a と b の XOR を計算し、結果を a に保存します。次に、b と a の XOR を行い、結果を b に保存します。最後に、a と b の XOR を計算し、結果を a に保存します。これで、変数 a と b の値が正常に交換されます。

左にシフト (<<)

左シフト演算子 (<<) は、指定されたビット数だけ 2 進数を左にシフトするために使用されます。左シフト演算では、指定された数の 0 が 2 進数の右側に追加されます。例えば:

unsigned int a = 0b1010; // 10
unsigned int b = a << 2; // 0b101000, or 40 in decimal

この例では、変数 a は 2 進数 1010 を表し、2 ビット左にシフトして 2 進数 101000、または 10 進数 40 を取得します。

右にシフト (>>)

右シフト演算子 (>>) は、指定されたビット数だけ 2 進数を右にシフトするために使用されます。右シフト演算では、2 進数の符号ビットに応じて、指定された数の 0 または 1 が 2 進数の左側に追加されます。例えば:

unsigned int a = 0b1010; // 10
unsigned int b = a >> 2; // 0b10, or 2 in decimal

C++ では、左シフト演算子と右シフト演算子 (<< と >>) を次のようなさまざまなシナリオで使用できます。

乗算と除算: 乗算と除算には左シフト演算子と右シフト演算子を使用できます。たとえば、整数 123 を 3 ビット左にシフトすることは、123 に 2 の 3 乗を乗算すること、つまり 123 * 8 = 984 と同等です。同様に、整数 984 を 3 ビット右にシフトすることは、984 を 2 の 3 乗で除算すること、つまり 984 / 8 = 123 と同等です。乗算と除算には次のコードを使用できます。
この例では、変数 a は 2 進数 1010 を表し、2 ビット右にシフトすると 2 進数 10、または 10 進数 2 が得られます。

int a = 123;
int b = a << 3; // 984
int c = b >> 3; // 123

やっと

この記事では主に C++ のビット演算について説明しますが、その他の記事については公式アカウント QStack を参照してください。

おすすめ

転載: blog.csdn.net/QStack/article/details/129720601