C のシフト演算子の種類
この記事では、変数の値のビットに対して実行されるビット単位の演算子の一種であるシフト演算子について説明します。 シフト演算子には、左シフト演算子と右シフト演算子の 2 種類があります。
これらの演算子を見てみましょう。
C のシフト演算子
左シフト演算子は <<
記号で特徴付けられ、右シフト演算子は >>
記号で特徴付けられます。 これらの演算子はバイナリであり、演算子の両側に 2つのオペランドが必要であり、両方とも整数でなければなりません。
右シフト算術演算子の構文は次のとおりです。
n >> m ;
n
の値を m
ビットだけ右にシフトしています。 ここで、n
と m
は整数です。
C のシフト演算子の種類
C には、右シフト演算子 >>
が 1つしかありません。C コンパイラは、シフトされる整数の型に応じて、使用される右シフトを選択します。
算術シフトは符号付き整数がシフトされるときに使用され、符号なし整数は論理シフトを使用してシフトされます。
どちらの場合も、論理シフトは符号なしの左シフトまたは右シフトに対して行われますが、符号付き整数値の場合は論理シフトを使用できません。 論理シフトは符号を変更できるため、算術シフトを使用してこの問題を取り除くことができます。
したがって、算術右シフトでは、MSB (符号ビット) がコピーされ、右にシフトされます。 効果は 2 で割ることです。
符号付き数値の構文:
n1=-n2;
n1>>m1;
符号付き整数の場合、最初のビットを空のスロットに格納し、シフト中にコピーを次のビットに移動します。
算術左シフトと論理左シフトは同じです。 負の値の場合、右シフトのみが異なります。
したがって、符号付きの値を右シフトするプログラムは、本質的に移植性がありません。
値を n
ビットだけ右にシフトする場合は、その値を n
を累乗した 2 で割り、値を n
ビットだけ左にシフトすると、値を n
で累乗した 2 で乗算します。
コード例:
#include <stdio.h>
int main(void) {
int dd = -15;
int ee = 15;
printf("value of dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
printf("value of dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
printf("value of dd right shift(sign bit) by 3 bits, is %d\n", dd >> 3);
printf("value of dd right shift by 4 bits, is %d\n", dd >> 4);
printf("value of ee right shift by 1 bits, is %d\n", ee >> 1);
printf("value of ee right shift by 2 bits, is %d\n", ee >> 2);
printf("value of ee right shift by 3 bits, is %d\n", ee >> 3);
return 0;
}
上記の C のコード例では、#include <stdio.h>
を、printf()
や scanf()
プログラムの関数。
main
関数は、プログラム実行の開始点です。 オペレーティング システムは、main
関数を呼び出してプログラムの実行を開始します。
次の 2つの変数 dd
と ee
は、正と負の 2つの異なる符号値で初期化されます。 次に、printf()
関数で単純にそれぞれ 1、2、3 の数値でシフト処理が行われ、符号値 ee
についても同様です。
算術右シフトが負の数に対して実行されると、上記の例のように、符号ビットがシフトされ、シフト中に作成された空のスロットにコピーされます。 両方の値は、指定された時間、符号付きおよび符号なしの数値で右にシフトされます。
符号なしの数値では、シフトは論理的です。 これは、値 15
を含む ee
変数で表され、右に 1 ビット、2 ビット、および 3 ビットシフトされます。
値を 2 で割ると数値 (ビット) のべき乗が増加することを示しています。たとえば、1 ビットシフトすると 15/2^1 となり、7 に等しくなります。
符号付き値のシフト中、最初のビット値はシフトのためにそれ自体をコピーし、シフト中に空のスロットに格納します。
出力:
符号なしおよび符号付きの値の右シフトは簡単です。 空いているビットはゼロで埋められます。 負の値の場合、右シフトの結果は実装定義です。
以下の例では偶数を使用して結果を確認し、偶数および奇数の符号付き数での右シフト演算子の動作を理解します。 以下のコードを見てみましょう。
#include <stdio.h>
int main(void) {
int dd = -16;
int ee = 16;
printf("value of dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
printf("value of dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
printf("value of dd right shift(sign bit) by 3 bits, is %d\n", dd >> 3);
printf("value of dd right shift by 4 bits, is %d\n", dd >> 4);
printf("value of ee right shift by 1 bits, is %d\n", ee >> 1);
printf("value of ee right shift by 2 bits, is %d\n", ee >> 2);
printf("value of ee right shift by 3 bits, is %d\n", ee >> 3);
return 0;
}
出力:
まとめ
論理シフト (符号ビット) は、算術右シフト演算子で制御できる右シフトで数値符号変更の問題を引き起こすと結論付けられています。 C および C++ には算術シフトのみがあり、一部の領域は未定義のまま実装定義されています。