ビット単位演算子とは
コンピュータープログラムでは、ビット単位演算子は式のビットパターンを操作するための演算子です。 ビットごとのAND、OR、排他的OR(XOR)、NOT、右シフトおよび左シフトは一般的な操作です。 ほとんどのコンピュータープログラミング言語には、これらの6つの演算子がすべて含まれています。 多くの場合、コンピューターのハードウェアを制御するプログラムの個々のビットを設定、クリア、または反転するために使用されます。 ビットごとの演算子は、データの暗号化および圧縮アルゴリズムでも頻繁に使用されます。
一般的なビット演算子は、通常、C、C ++、Javaなどのプログラミング言語で象徴的に表されます。 これらは、プラス記号やマイナス記号などの算術演算子と同じように式で使用されます。 ビット単位の演算子ANDは、アンパサンド& 、OR、パイプ|で表されます。 キャレットとのXOR ^ NOTは補数演算子とも呼ばれ、チルダ〜で示されます。
右シフト演算子は、右>>を指す二重キャレットを使用します。 対照的に、左シフトは左向きのダブルキャレット<<によって示されます。 Javaには、右向きのトリプルキャレット>>>で示される別の右シフト操作が含まれています。
ビット演算子は、オペランドのビットの各ペアに論理演算を適用します。 NOT、右シフトと左シフトには真のオペランドが1つしかありません。 シフト操作の2番目の値はビットカウントです。 ビット演算子の動作をよりよく理解するために、個人はオペランドを2進数として視覚化できます。 たとえば、補数演算子は、単一のオペランドの各ビットを反対の状態に反転します。 1はゼロになり、0は1になります。 8ビットのバイナリ値00110101の補数は11001010です。
AND演算子には2つのオペランドがあります。 ビットごとに、各オペランドの対応する1ビットを使用して論理AND演算が実行されます。 各ビット操作の結果は、結果全体のそのビット位置に配置されます。 たとえば、AND演算子は、一方のオペランドのビット7と他方のオペランドのビット7を処理します。 結果は、結果全体のビット7に格納されます。
AND演算では、結果が1になるように両方のオペランドビットが1でなければなりません。そうでない場合、結果はゼロになります。 たとえば、オペランドの8ビットバイナリ値が00110101と11110000の場合、結果は00110000になります。AND演算子の一般的な使用法は、結果の特定のビットをゼロにすることです。 これは、オペランドのいずれかのビット位置にゼロを配置することにより行われます。
OR演算では、結果がゼロになるためには、両方のオペランドビットがゼロでなければなりません。 それ以外の場合、結果は1です。 OR演算子の一般的な使用法は、結果の特定のビットを1に設定することです。 これは、いずれかのオペランドのビット位置に1を配置することにより行われます。 XOR演算では、両方のオペランドビットがゼロの場合、または両方のオペランドビットが1の場合、結果はゼロです。それ以外の場合、結果は1です。
左シフトおよび右シフトは、オペランドのビットを指定されたビット数だけ左または右に移動します。 論理的な右シフトは、シフトの一部としてゼロを左端のビットに移動します。 算術右シフトは、シフト前の左端のビット(符号ビット)をシフト後の同じ位置にコピーします。 元のビットも残りとともに右にシフトされます。 どちらのタイプの左シフトも、右端のビットにゼロを移動します。
オペランドが右シフトされると、シフトの前の右端のビットが単に破棄されます。 同様に、左シフトの前の左端のビットは破棄されます。 オペランドのもう一方の端まで折り返しません。
ビット単位のシフト操作は、言語および実装に依存します。 たとえば、CおよびC ++では、オペランドが符号なし整数の場合、 >>および<<は論理シフトを実行します。 オペランドが符号付き整数の場合、代わりに算術シフトが行われる可能性があります。 Javaでは、すべてのオペランドは符号付きと見なされ、算術シフトは常に>>および<<で実行されます 。 >>>演算子は論理的な右シフトに使用されますが、慎重に型キャストすることなく、誤って算術右シフトを実行する可能性があります。
また、オペランドのビット長が異なる場合や、一部が符号付きで一部が符号なしの場合に問題が発生する可能性があります。 複雑な式の途中にあるビットごとの演算子と数値定数は、予想どおりに評価されない場合があります。 式の各数量のサイズと符号付き/符号なしの性質を指定するように注意する必要があります。 これは、プログラムコード内の特定の変数タイプへの慎重な型キャストまたは暫定的な割り当てで実行できます。