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

⚡ スマートサマリー

C言語のビット演算子は、整数オペランドに対してAND、OR、XOR、補数、シフト演算を使用して、個々のビットレベルでデータを操作し、低レベルおよび組み込みプログラミングにおいて、より高速な計算、フラグのパック、ハードウェアの制御などを実行します。

  • 🧮 Operators: 6つの演算子(AND(&)、OR(|)、XOR(^)、補数(~)、左シフト(<<)、右シフト(>>))は、ビット単位で動作します。
  • 🔗 AND & OR: & の結果は、両方のビットが 1 の場合にのみ 1 になります。| の結果は、どちらかのビットが 1 のときに 1 になります。
  • 🔀 排他的論理和: ^ の結果は、ちょうど 1 つのビットが 1 の場合に 1 になります。これは、ビットの切り替えやスワップに便利です。ping 値。
  • ↔️ Shifts: <<演算子と>>演算子は、ビットを左右にスライドさせ、2のべき乗で乗算または除算します。
  • 🔁 補体: ~ 演算子はすべてのビットを反転させるので、0000 1111 は 1111 0000 になります。
  • 🤖 AIによる支援: AIアシスタントとGitHub Copilotは、ビットマスクとシフトのロジックを迅速に生成し、説明します。

ビット単位 OperaC の tors

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

ビット単位 Operaビット演算は、ビットレベルでのデータ操作、すなわちビットレベルプログラミングに使用されます。ビット演算は、1つまたは複数のビットパターンまたはバイナリ数値を、個々のビットレベルで操作します。数値計算において、計算処理を高速化するために使用されます。

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

Operator 意味
& ビット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演算子を組み合わせると、次のように使用できます。trac整数式からデータを取得します。ビットシフト演算子の使用方法を示すプログラムを作成してみましょう。

#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

よくあるご質問

ビットごとのAND(&)は個々のビットに対して演算を行い、整数を返しますが、論理AND(&&)は式全体をテストし、単一の真または偽のブール値を返します。

Shift 1 マスクを作成するには、値 | (1 << n) で設定し、値 & ~(1 << n) でクリアし、値 ^ (1 << n) で切り替えます。

n だけ左シフトすると、符号なしの値を 2 の n 乗で乗算します。右シフトすると、その値で除算します。そのため、コンパイラは速度向上のためにシフト演算を使用します。

数値と1をチェックします。最下位ビットは奇数の場合は1、偶数の場合は0を返すため、剰余演算子よりも高速です。

組み込みファームウェア、ドライバ、暗号化、圧縮、グラフィックス、ネットワークなどは、フラグのパック、ハードウェアレジスタの読み取り、パーミッションマスクの構築、算術演算の高速化などにこれらを使用します。

Shift 演算子は関係演算子よりも強く結合しますが、&、^、| は等号より下ですが論理 && と || より上に位置するため、安全のために括弧で囲みます。

はい。AIコーディングアシスタントは、プロンプトに基づいてマスクとシフトを生成し、否定補数について説明し、バイナリの例を動作するC言語に変換します。結果は必ずテストしてください。

GitHubコパイロット コメントからビットマスクマクロ、ビット設定およびクリアヘルパー、シフト演算を提案します。その補完候補を自分のビットレイアウトと照らし合わせて確認してください。