C言語のビット演算

ビット演算の概念: ビット演算は、2 進数を直接演算する演算です。
C言語のビット演算は他の高級言語と異なる大きな特徴であり、この機能を利用することでハードウェアプログラミングやシステムコールなどの低レベル演算を実現することができます。
注: ビット演算を実行する場合、データ オブジェクトは整数 (int、short int、unsigned int、long int) または文字番号のみにすることができ、単精度や倍精度などの他のデータ型にすることはできません。
C言語には下図に示すように6種類のビット演算子があり、
ここに画像の説明を挿入
このうちビット反転演算子「~」のみが単項演算子で、その他は両眼演算子です。
優先順位:
ビット単位の否定演算子「~」は、算術演算子や関係演算子よりも高い優先順位を持ち、すべてのビット単位の演算子の中で最も高い優先順位を持ちます。左シフト "<<" および右シフト ">>" 演算子が続き、これら 2 つの演算子の優先順位は関係演算子の優先順位よりも高くなりますが、算術演算子、ビット単位の AND "&"、ビット単位の演算子または "|" の優先順位よりは低くなります。 " およびビット単位の排他的または "^" は、算術演算子や関係演算子の優先順位よりも低くなります。

ビット単位の AND (&)

ビットごとの AND 演算の機能は、対応する 2 進ビットに従って、演算に参加する 2 つのオペランドに対して「AND」演算を実行することです。対応する 2 つの 2 進ビットが両方とも 1 の場合にのみ、結果ビットは 1 になり、それ以外の場合は、結果ビットが 1 になります。 0. 演算に関係する数値は 2 の補数の形式で表示されます。たとえば、9&8 の結果は
9: 0 0 0 0 1 0 0 1
8: 0 0 0 0 1 0 0 0
———————
8: 0 0 0 0 1 0 0 0
ビット単位の AND 演算は次のようになります。通常、特定のビットをクリアしたり、ビットを予約したりするために使用されます。たとえば、オペランド a の値は 1001 1010 0010 1011 であり、この数値の上位 8 ビットはクリアされ、下位 8 ビットは予約される必要があります。解決策は、0000 0000 1111 1111 で計算することです。演算後の結果は 0000 0000 0010 1011 で、オペランドの上位 8 ビットはすべて 0、下位 8 ビットは前と同じです。

ビット単位の OR (|)

ビット単位の or の演算規則は、演算に参加する 2 つの数値に対応する 2 進位相 or です。対応するバイナリ ビットの 1 つが 1 である限り、結果のビットは 1 になります。参加する数値はすべて 2 の補数の形式で表示されます。例:
0 0 1 0 0 1 1
0 0 0 0 1 1 0 1 1
———————
0 0 1 1 1 1 1 1
「|」演算の特性に従って、次のように使用できます。データの特定の位置を 1 に設定します。設定されるビットの 2 進数が 1 で、他のビットが 0 である限り、「|」演算を実行できます。

ビット単位の否定演算 (~)

ビット単位の反転演算はビット単位の NOT 演算とも呼ばれ、オペランドのすべてのビットを反転します (つまり、1 が 0 になり、0 が 1 になります)。ビット演算子の中で唯一の単項演算子です。例: 0101 0011 は 1010 1100 に反転されます。

ビットごとの XOR 演算 (^)

ビットごとの XOR 演算の演算規則は、演算に参加する 2 つのオペランドの対応する 2 進ビットが同じである場合、結果ビットは 0 になり、それらが異なる場合、結果ビットは 1 になります。たとえば、
0 0 1 0 1 1 0 1
0 1 1 0 0 1 1 0
———————
0 1 0 0 1 0 0 0 と
の XOR の結果はそのままで、1 との XOR の結果はそのままです。元の数値と等価です。数値はビットごとに反転されます。この特性を利用して、対応するビットが 1 で残りのビットが 0 である別のオペランドと XOR 演算される限り、オペランドのいくつかのビットを反転できます。
XOR は、次のような 2 つの数値の交換も実現できます。

#include <stdio.h>
void main()
{
    
    
	int a,b;
	a=56,b=37;
	a=a^b;
	b=b^a;
	a=a^b;
	printf("a=%d,b=%d\n",a,b); 
}

出力は a=37、b=56 です。変更操作では、ab の交換を実現するために中間変数を使用しません。これも XOR の使用法です。

左シフト演算(<<)

左シフト演算の規則は、「<<」の左側にあるオペランドのすべての 2 進ビットを特定のビット数だけ左にシフトし、「」の右側の数値でシフトされる桁数を指定します。 <<" の場合、上位ビットを破棄し、下位ビットに 0 を追加します。例:
x : 0000 0101 (x=5)
y=x<<1 :0000 1010 (y=10)
z=x<<2 :0001 0100 (z=20)

1 ビットを左にシフトすることは、元の数値を 2 で乗算することと同等であり、n ビットを左にシフトすることは、元の数値を 2^n で乗算することと同等であることがわかります。ここで、n は移動する桁数です。 。実際の演算では、乗算演算よりも左シフト演算の方がはるかに高速であるため、乗算演算の代わりに左シフト演算が使用されることがよくあります。
**注: 乗算演算を左シフト演算で置き換える場合、左シフト部分に 2 進数 1 が含まれている場合、この機能は適用されません。**例:
x : 0100 0110 (x=70)
y=x<<1 :1000 1100 (y=140)
z=x<<2 :0001 1000 (z=24)

右シフト演算(>>)

右シフト演算の機能は、「>>」の左側にあるオペランドのすべての 2 進ビットを右に移動することであり、「>>」の右側の数値によって移動するビット数が決まります。左端のパディングは 2 つのケースに分けられます: 数値が符号なし数値または正の整数の場合、上位ビットは 0 で埋められ、数値が負の整数の場合、上位ビットは 0 または 1 で埋められます。コンパイルシステムによって異なります。
: a : 0000 1011
b=a>>2 : 0000 0010

要約する

ビット演算は C 言語の主要な機能であり、一部の低レベル演算はビット演算によって実現できます。マイコンプログラミングではC言語のビット演算がよく使われます。各ビット演算のルールとそれによって実現できる機能をよく理解してください。
「&」演算: 通常、特定のビットをクリアするか、ビットを予約する
ために使用されます。 「|」演算: データの特定の位置を設定するために使用できます。 「
^」 演算: オペランドのいくつかのビットの反転を実現でき、また、次の目的にも使用できます。 2 つの数値の交換
「<<」演算を実現します。乗算の代わりに使用できますが、その条件に注意してください

もう 1 つ区別する必要があるのは、「&&」と「&」、「||」と「|」です。論理 and とビット and、論理 or とビット or を混同しないでください。「>>」演算における上位ビットの補完の仕方に注意してください。
演算に含まれる数値の長さが異なる場合、このとき、2 つの数値は右端に従って演算でき、高次の充填方法は次のとおりです。短い数値が正の数または符号なしの数値である場合、その上位ビットは 0 で埋められ、それより短い場合、数値が負の場合、上位ビットは 1 で埋められます。

Supongo que te gusta

Origin blog.csdn.net/Tao_9/article/details/129961428
Recomendado
Clasificación