シフト演算子
ビット演算子の中でも数値の各ビットを左または右へシフトさせるときに使用する演算子がシフト演算子です。ここでは C 言語におけるシフト演算子の使い方について解説します。
(Last modified: )
シフト演算子の種類
ビット演算子の中でも数値の各ビットを左または右へシフトさせるときに使用する演算子がシフト演算子です。シフト演算子は次の 2 つが用意されています。
演算子 | 記述例 | 意味 |
---|---|---|
<<= | a = a << 2 | 左シフト |
>>= | a = a >> 2 | 右シフト |
それではまず左シフトから確認してみます。例として 11(0x000B) を 1 ビット左へシフトさせてみます。
0000000000001011 = 11 ---------------- 0000000000010110 = 22
各ビットを指定した数だけ左へシフトします。左端からはみ出した部分は削除され、シフトしたことによって空いた右端は 0 が格納されます。結果として 11 を 1 ビット左へシフトすると 22 となります。
では同じように 11(0x000B) を 2 ビット左へシフトさせてみます。
0000000000001011 = 11 ---------------- 0000000000101100 = 44
11 を左へ 2 ビットシフトすると 44 となります。プログラムで実際に記述する場合は次のようになります。
short int a = 0x000B; a = a << 2;
では今度は右シフトを確認してみます。例として 11(0x000B) を 1 ビット右へシフトさせてみます。
0000000000001011 = 11 ---------------- 0000000000000101 = 5
各ビットを指定した数だけ右へシフトします。右端からはみ出した部分は削除され、シフトしたことによって空いた左端は 0 が格納されます。結果として 11 を 1 ビット右へシフトすると 5 となります。プログラムで実際に記述する場合は次のようになります。
short int a = 0x000B; a = a >> 1;
※なお 2 進数において左へ 1 ビットシフトするとうことは数値が 2 倍になることを表しています。また右へ 1 ビットシフトするということは数値が 1/2 になることを表しています。
負の数を右シフトする場合の注意点
負の数を右シフトする場合には注意が必要です。例えば -11 と言う数値を例に考えてみます。
1111111111110101 = -11
右へ 1 つシフトさせてみます。前述した説明ですと右へシフトした結果空いた左端には 0 を追加していました。
1111111111110101 ---------------- 0111111111111010
最上位ビットが 1 の場合は負の数ですが、右へシフトさせることによって正の数になってしまいます。そこで負の数の場合には右へシフトした結果空いた左端には 1 を追加する場合があります。
1111111111110101 ---------------- 1111111111111010
負の数に対して右シフトを行った結果がどうなるのかは処理系によって異なります。プログラムが同じでも処理系によって結果が異なる可能性がありますので、負の数に対して右シフトはあまり行わない方がいいかもしれません。
それでは簡単なサンプルを作成します。
#include <stdio.h> int main(void){ short int a; a = 11; printf("%d << 2 = %d\n", a, a << 2); printf("%d >> 2 = %d\n", a, a >> 2); a = -11; printf("%d << 1 = %d\n", a, a << 1); printf("%d >> 1 = %d\n", a, a >> 1); return 0; }
テキストエディタでプログラムを記述したあと sample.c という名前で保存します。(文字コードは UTF-8(BOM付き) です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで最初にコンパイルを行います。
cl sample.c
コンパイルが終わりましたら、次のように実行してください。
sample
シフト演算子を使った演算結果を画面に出力しました。
-- --
C 言語におけるシフト演算子の使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。