C のビット演算子:AND、OR、XOR、シフト、補数
ビット演算子とは
ビット演算子 ビット レベルでデータを操作するために使用され、ビット レベル プログラミングとも呼ばれます。 Bitwise は、個々のビットのレベルで 1 つ以上のビット パターンまたは 2 進数を操作します。それらは数値計算で使用され、計算プロセスを高速化します。
以下は、「C」プログラミング言語で提供されるビット演算子のリストです:
オペレーター 意味 & ビット AND 演算子| ビットごとの OR 演算子^ ビット単位の排他的 OR 演算子~ 2 項 1 の補数演算子は単項演算子です<< 左シフト演算子>> 右シフト演算子
ビット演算子は、float、double などのプリミティブ データ型に直接適用することはできません。互換性があるため、ビット演算子は主に整数データ型で使用されることを常に覚えておいてください。
ビット単位の論理演算子は、最下位ビット (つまり、右端のビットである LSB ビット) から開始して、左端のビットである MSB (最上位ビット) に向かってデータをビットごとに処理します。
ビットごとの論理演算子の計算結果は、以下の表に示されています。
× はい x &y × | y x^y 0 00000 10111 00111 1110このチュートリアルでは、次のことを学びます-
- ビット演算子とは?
- ビットごとの AND
- ビットごとの OR
- ビットごとの排他的 OR
- ビットシフト演算子
- ビット補数演算子
ビットごとの AND
これは、最も一般的に使用されるビット単位の論理演算子の 1 つです。これは、単一のアンパサンド記号 (&) で表されます。 (&) 演算子の両側に 2 つの整数式が記述されます。それ以外の場合、結果は常に 0 です。
次のような値を持つ 2 つの変数 op1 と op2 があるとします:
Op1 = 0000 1101 Op2 = 0001 1001
変数 op1 と op2 の AND 演算の結果は次のようになります
Result = 0000 1001
ご覧のとおり、2 つの変数がビットごとに比較されます。両方の変数のビットの値が 1 の場合、結果は 1 または 0 になります。
ビットごとの OR
これは、単一の縦棒記号 (|) で表されます。 (|) 演算子の両側に 2 つの整数式を記述します。
少なくとも 1 つの式の値が 1 の場合、ビットごとの OR 演算の結果は 1 になります。それ以外の場合、結果は常に 0 です。
次のような値を持つ 2 つの変数 op1 と op2 があるとします:
Op1 = 0000 1101 Op2 = 0001 1001
変数 op1 と op2 の OR 演算の結果は次のようになります
Result = 0001 1101
ご覧のとおり、2 つの変数がビットごとに比較されます。いずれかの変数のビットの値が 1 の場合、結果は 1 か 0 になります。
ビットごとの排他的 OR
記号 (^) で表されます。 (^) 演算子の両側に 2 つの整数式を記述します。
式の 1 つだけが 1 の値を持つ場合、ビットごとの排他的論理和演算の結果は 1 になります。それ以外の場合、結果は常に 0 です。
次のような値を持つ 2 つの変数 op1 と op2 があるとします:
Op1 = 0000 1101 Op2 = 0001 1001
変数 op1 と op2 の XOR 演算の結果は次のようになります
Result = 0001 0100
ご覧のとおり、2 つの変数がビットごとに比較されます。値 1 を保持する変数が 1 つだけの場合、結果は常に 0 です。それ以外の場合は 0 が結果になります。
ビットごとの論理演算子を示す簡単なプログラムを書きましょう。
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int b = 21; /* 21 = 010101 */ int c = 0; c = a & b; /* 20 = 010100 */ printf("AND - Value of c is %d\n", c ); c = a | b; /* 21 = 010101 */ printf("OR - Value of c is %d\n", c ); c = a ^ b; /* 1 = 0001 */ printf("Exclusive-OR - Value of c is %d\n", c ); getch(); }
出力:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
ビット単位のシフト演算子
ビットごとのシフト演算子は、ビット パターンを左側または右側に移動/シフトするために使用されます。左と右は、次のように表される「C」によって提供される 2 つのシフト演算子です:
Operand << n (Left Shift) Operand >> n (Right Shift)
ここで、
- オペランドは、シフト演算を実行する必要がある整数式です。
- 「n」は、整数式でシフトする必要があるビット位置の総数です。
左シフト操作は、「n」個のビットを左側にシフトします。式の左端のビットがポップアウトされ、値 0 の n ビットが右側に埋められます。
右シフト操作は、「n」個のビットを右側にシフトします。式の右端の「n」ビットがポップアウトされ、左側に値 0 が入力されます。
例:x はデータ 1111 の整数式です。シフト演算を実行した後の結果は次のようになります:
x << 2 (left shift) = 1111<<2 = 1100 x>>2 (right shift) = 1111>>2 = 0011
シフト演算子を組み合わせて、整数式からデータを抽出するために使用できます。ビットごとのシフト演算子の使用法を示すプログラムを書きましょう。
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - Value of c is %d\n", c ); c = a >> 2; /*05 = 000101 */ printf("Right shift - Value of c is %d\n", c ); return 0; }
出力:
Left shift - Value of c is 80 Right shift - Value of c is 5
左シフト操作を実行すると、値は 80 になり、2 進数で 101000 に相当します。
右シフト演算を実行した後、値は 5 になり、2 進数で 000101 に相当します。
ビット補数演算子
ビット単位の補数は、常に 1 つの値またはオペランドのみを取るため、1 の補数演算子とも呼ばれます。単項演算子です。
任意のビットで補数を実行すると、すべての 1 が 0 になり、その逆も同様です。
0000 1111 を含む整数式がある場合、ビットごとの補数演算を実行した後、値は 1111 0000 になります。
ビット単位の補数演算子は、シンボル チルダ (~) で表されます。
ビットごとの補数演算子の実装を示すプログラムを書きましょう。
#include <stdio.h> int main() { int a = 10; /* 10 = 1010 */ int c = 0; c = ~(a); printf("Complement - Value of c is %d\n", c ); return 0; }
出力:
Complement - Value of c is -11
これまでに説明したすべてのオペラトの例を含む別のプログラムを次に示します。
#include <stdio.h> main() { unsigned int x = 48; /* 48 = 0011 0000 */ unsigned int y = 13; /* 13 = 0000 1101 */ int z = 0; z =x & y; /* 0 = 0000 0000 */ printf("Bitwise AND Operator - x & y = %d\n", z ); z = x | y; /* 61 = 0011 1101 */ printf("Bitwise OR Operator - x | y = %d\n", z ); z= x^y; /* 61 = 0011 1101 */ printf("Bitwise XOR Operator- x^y= %d\n", z); z = ~x; /*-49 = 11001111 */ printf("Bitwise One's Complement Operator - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Bitwise Left Shift Operator x << 2= %d\n", z ); z= x >> 2; /* 12 = 0000 1100 */ printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
プログラムをコンパイルして実行すると、次の結果が生成されます:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
まとめ
- ビット単位の演算子は、「C」によって提供される特別な演算子セットです。
- ビット レベルのプログラミングで使用されます。
- これらの演算子は、整数式のビットを操作するために使用されます。
- 論理、シフト、および補数は、3 種類のビット演算子です。
- ビット単位の補数演算子は、式のビットを逆にするために使用されます。
C言語