C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のシフト演算子(<<・>>)とは?仕組みと使い方を実例で解説

シフト演算子とは

C++におけるビット単位のシフト演算子には、次の2種類があります。

  • 右シフト演算子(>>):shift_expression のビット列を右へ移動させる
  • 左シフト演算子(<<):shift_expression のビット列を左へ移動させる

左シフト演算子(<<)の動作

左シフト演算子は、加法式(additive-expression)で指定された桁数だけ、shift-expression のビットを左へ移動させます。移動によって空いたビット位置は0で埋められます。左シフトは論理シフトであり、末尾からあふれたビット(符号ビットを含む)は破棄されます。

右シフト演算子(>>)の動作

右シフト演算子は、加法式で指定された桁数だけ、shift-expression のビットパターンを右へ移動させます。空いたビット位置の扱いは型によって異なります。

  • 符号なし整数の場合:空いたビット位置は0で埋められる
  • 符号付き整数の場合:符号ビットで埋められる(正の数なら0、負の数なら1が入る)

サンプルコード

#include<iostream>
using namespace std;
int main() {
    int a = 1, b = 3;
    
    // 現在のaは 00000001
    // 3ビット左にシフトすると 00001000、つまり8になる
    a = a << 3;
    cout << a << endl;
    
    // aを2ビット右にシフトすると 00000010、つまり2になる
    a = a >> 2;
    cout << a << endl;
    return 0;
}

実行結果

このプログラムを実行すると、次の出力が得られます。

8
2

負の数を扱う際の注意点

シフト演算子は負の数に対しては挙動が大きく異なる点に注意が必要です。

  • 符号付きの負の数を右シフトした結果は、処理系依存(implementation-defined)です。
  • 符号付きの数を左シフトして符号ビットに影響が及ぶ場合、その結果は未定義動作(undefined behavior)となります。

移植性の高いコードを書くためには、これらのケースを避けるか、事前に仕様を確認しておくことが重要です。

複合代入演算子(<<= と >>=)

シフト結果を直接左辺の変数に代入できる複合代入演算子も用意されています。

  • <<=:左シフトして代入する
  • >>=:右シフトして代入する

例えば a <<= 3;a = a << 3; と同じ意味になります。

シフト演算子についてさらに詳しく知りたい方は、Microsoft Learnの公式ドキュメントを参照してください。

  1. C#の代入演算子とは?種類と使い方をサンプルコード付きで解説

    演算子(Operator)とは、コンパイラに対して特定の数学的処理や論理的な操作を実行するよう指示するための記号のことです。C#には多くの演算子が用意されていますが、本記事ではその中でも基本となる「代入演算子」に焦点を当て、それぞれの役割と具体的な使い方をサンプルコードとともにわかりやすく解説します。代入演算子を正しく理解すると、コードをより簡潔かつ読みやすく書けるようになります。C#の主な代入演算子一覧以下の表は、C#で使用できる代入演算子の一覧です。「=」のような単純な代入だけでなく、計算と代入を同時に行う「複合代入演算子」も多数あります。演算子説明使用例=単純代入演算子。右側のオペランド

  2. C#の左シフト演算子(<<)と右シフト演算子(>>)の使い方を解説

    C#には、ビット単位でデータを操作するための「シフト演算子」が用意されています。代表的なものが左シフト演算子(<<)と右シフト演算子(>>)です。この記事では、それぞれの仕組みと具体的な使い方をサンプルコードとともに解説します。 左シフト演算子(<<)とは 左シフト演算子は、左側のオペランドの値を、右側のオペランドが指定したビット数だけ左に移動させる演算子です。 ビットが左にずれると、空いた下位ビットには0が埋められます。2進数では1桁左にずれるごとに値が2倍になるため、左シフトは「2のn乗倍」の計算としても利用できます。 右シフト演算子(>>)