C/C++の左シフト・右シフト演算子の使い方を解説
C言語やC++には、ビット列を左右に移動させる「シフト演算子」が用意されています。シフト演算は、2のべき乗による乗算・除算を高速に行いたい場合などに活用される重要な演算です。この記事では、左シフト演算子(<<)と右シフト演算子(>>)の基本的な動作を、サンプルコードと実行結果とともにわかりやすく解説します。
左シフト演算子(<<)とは
左シフト演算子では、左オペランドの値が、右オペランドで指定されたビット数だけ左へ移動します。空いた下位のビットには0が埋められます。
たとえば「y << 2」と書くと、yのビット列が2ビット分だけ左にずれます。これは数学的にはy × 2²(4倍)と同じ結果になります。
左シフトのサンプルコード
以下は、C言語で左シフト演算子を使用する例です。変数 y の値 28(2進数で 11100)を、0〜3ビットずつ左にシフトしています。
#include <stdio.h>
int main() {
int y = 28; // 11100
int i = 0;
for(i; i<=3; ++i)
printf("Left shift by %d: %d\n", i, y<<i);
return 0;
}
実行結果
Left shift by 0: 28 Left shift by 1: 56 Left shift by 2: 112 Left shift by 3: 224
実行結果を見ると、1ビット左にシフトするごとに値が2倍になっていることが確認できます。つまり、左シフトは2のn乗倍の計算として機能します。
- 28 << 0 → 28 × 1 = 28
- 28 << 1 → 28 × 2 = 56
- 28 << 2 → 28 × 4 = 112
- 28 << 3 → 28 × 8 = 224
右シフト演算子(>>)とは
右シフト演算子では、左オペランドの値が、右オペランドで指定されたビット数だけ右へ移動します。符号なし整数の場合、空いた上位のビットには0が埋められます。
右シフトは数学的にはy ÷ 2ⁿ(2のn乗で割る)と同じ効果があります。小数点以下は切り捨てられるため、整数除算に相当します。
右シフトのサンプルコード
以下は、C言語で右シフト演算子を使用する例です。変数 x の値 10(2進数で 1010)を、0〜1ビットずつ右にシフトしています。
#include <stdio.h>
int main() {
int x = 10; // 1010
int i = 0;
for(i; i<2; i++)
printf("Right shift by %d: %d\n", i, x>>i);
return 0;
}
実行結果
Right shift by 0: 10 Right shift by 1: 5
1ビット右にシフトすると値が半分になっていることがわかります。
- 10 >> 0 → 10 ÷ 1 = 10
- 10 >> 1 → 10 ÷ 2 = 5
まとめ
シフト演算子を使いこなすことで、乗算や除算よりも高速なビット単位の処理が可能になります。
- 左シフト(<<):指定したビット数だけ左に移動し、値は2ⁿ倍になる
- 右シフト(>>):指定したビット数だけ右に移動し、値は2ⁿで割った値になる(負の数の場合は処理系依存の挙動に注意)
なお、負の数に対する右シフトの扱いは処理系によって異なる場合があるため、移植性を重視するコードでは注意が必要です。
-
C#のビット演算子とシフト演算子の使い方を徹底解説
ビット演算子(Bitwise Operator)は、数値を2進数のビット列として扱い、1ビット単位で演算を行うための演算子です。フラグ管理や高速な計算処理など、パフォーマンスが求められる場面で活用されます。C#で使える主なビット演算子以下の表は、C#でサポートされているビット演算子の一覧です。ここでは、変数Aに60(2進数:0011 1100)、変数Bに13(2進数:0000 1101)が格納されているものとして説明します。演算子説明使用例&ビット単位のAND演算子。両方のオペランドで対応するビットが1の場合のみ、結果にそのビットをコピーします。(A & B) = 12(000
-
C#のビット単位右シフト演算子(>>)の使い方をわかりやすく解説
ビット単位右シフト演算子とは ビット演算子(Bitwise Operator)は、数値をビット単位で扱い、1ビットずつ操作を行う演算子です。その中でもビット単位の右シフト演算子「>>」は、左側のオペランドの値を、右側のオペランドで指定されたビット数だけ右へ移動させる働きを持ちます。 たとえば、次のような値があったとしましょう。 60(2進数:0011 1100) この値に対して、右へ2ビットシフトするには次のように記述します。 c = a >> 2; 2回の右シフトが行われると、値は次のように変化します。 15(2進数:0000 1111) これは、各ビットが右に移動し