工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

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

これは、最も一般的に使用されるビット単位の論理演算子の 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」個のビットを左側にシフトします。式の左端のビットがポップアウトされ、値 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言語

  1. C# クラスとオブジェクト
  2. C# の抽象クラスとメソッド
  3. C# 部分クラスと部分メソッド
  4. C# の封印されたクラスとメソッド
  5. C++ 演算子
  6. C キーワードと識別子
  7. C プログラミング演算子
  8. IoTとブロックチェーン–パラダイムシフト
  9. C++ の演算子と例:型とプログラムとは
  10. Python 演算子:算術、論理、比較、代入、ビット単位、優先順位
  11. C - 定数とリテラル