ビット単位 OperaC のトル: AND、OR、XOR、 Shift &補完

ビットワイズとは Operaトール?

ビット単位 Operaトー ビット レベルでデータを操作するために使用されます。これはビット レベル プログラミングとも呼ばれます。ビット単位は、1 つ以上のビット パターンまたは 2 進数値を個々のビットのレベルで操作します。数値計算で使用され、計算処理を高速化します。

以下は、「C」プログラミング言語で提供されるビット演算子のリストです。

Operaタ 意味
& ビットAND演算子
| ビットOR演算子
^ ビット排他的論理和演算子
~ 2 進数の 1 の補数 Operatorは単項演算子です
<< 左シフト演算子
>> 右シフト演算子

ビット演算子は、float、double などのプリミティブ データ型に直接適用することはできません。ビット演算子は互換性のため、主に整数データ型で使用されることを常に覚えておいてください。

ビット論理演算子は、最下位ビット、つまり右端のビットである LSB ビットから始まり、左端のビットである MSB (最上位ビット) に向かってビットごとにデータを処理し続けます。

ビット論理演算子の計算結果を以下の表に示します。

x y x&y × | よ x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

ビットごとのAND

これは、最も一般的に使用される論理ビット演算子の 1 つです。これは、1 つのアンパサンド記号 (&) で表されます。(&) 演算子の両側には、2 つの整数式が記述されます。
両方のビットの値が 1 の場合、ビット単位の AND 演算の結果は 1 になります。それ以外の場合、結果は常に 0 になります。

次のような値を持つ 2 つの変数 op1 と op2 があると考えてみましょう。

Op1 = 0000 1101
Op2 = 0001 1001

変数op1とop2のAND演算の結果は次のようになります。

Result = 0000 1001

ご覧のとおり、1 つの変数が少しずつ比較されます。 両方の変数のビットの値が 1 の場合、結果は 0 になり、それ以外の場合は XNUMX になります。

ビットOR

これは、1 つの縦棒記号 (|) で表されます。(|) 演算子の両側に 2 つの整数式が記述されます。

式の少なくとも 1 つの値が 1 の場合、ビット OR 演算の結果は 0 になります。それ以外の場合、結果は常に XNUMX になります。

次のような値を持つ 2 つの変数 op1 と op2 があると考えてみましょう。

Op1 = 0000 1101
Op2 = 0001 1001

変数op1とop2のOR演算の結果は次のようになります。

Result = 0001 1101

ご覧のとおり、1 つの変数が少しずつ比較されます。 いずれかの変数のビットの値が 1 の場合、結果は 0 になり、それ以外の場合は XNUMX になります。

ビット排他的論理和

これは記号 (^) で表されます。(^) 演算子の両側に 2 つの整数式が記述されます。

ビット単位の排他的論理和演算の結果は、式の 1 つだけが 1 の値を持つ場合は 0 になります。それ以外の場合は、結果は常に XNUMX になります。

次のような値を持つ 2 つの変数 op1 と op2 があると考えてみましょう。

Op1 = 0000 1101
Op2 = 0001 1001

変数op1とop2のXOR演算の結果は次のようになる。

Result = 0001 0100

ご覧のとおり、1 つの変数が少しずつ比較されます。 0 つの変数のみが値 0 を保持する場合、結果は XNUMX になり、それ以外の場合は結果は XNUMX になります。

ビット論理演算子を示す簡単なプログラムを書いてみましょう。

#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' は次のように表されます。

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

Shifts 演算子を組み合わせると、整数式からデータを抽出するために使用できます。ビットシフト演算子の使用方法を示すプログラムを作成しましょう。

#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 になり、101000 進数では XNUMX になります。

右シフト演算を実行すると、値は 5 になり、000101 進数では XNUMX になります。

ビット補数演算子

ビット補数は、常に 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 種類です。
  • ビット補数演算子は、式のビットを反転するために使用されます。