ビット列に含まれるビットの位置を、左方向あるいは右方向にスライド(シフト)させる操作のことです。
左右どちらの方向へシフトするのかは重要なので、左方向にシフトすることを左シフト、右方向にシフトすることを右シフトと呼び分けます。
シフトを行うと、一方の端からはビットが溢れることになり、逆側の端には空きができることになります。溢れた部分と空いた部分をどのように処置するかにはいくつか考え方がありますが、溢れた部分は単純に捨て、空いた部分には 0 を埋めることが多いです。また、ビット列が循環しているイメージで、溢れた部分を空いた部分に入れるという発想もあり、特に、ローテート(環状シフト)と呼ばれます。
また、論理シフトと算術シフトという分類もあります。論理シフトはここまで説明したように、ビット列のすべてのビットを対象にしたシフト操作です。算術シフトは、ビット列の最上位ビットを変化させず、残りのビットだけでシフトを行うというもので、整数の最上位に符号ビットが置かれているケースで、符号ビットを破壊してしまわないようにするためのシフト操作です。
プログラミング言語には、シフト演算を行うための演算子が用意されていることがあります。また、論理シフトと算術シフトを使い分けることができる言語もあります。
C言語や C++ では、左シフトを <<
、右シフトを
>>
で表現します。
これらの言語では、負の整数を右シフトするときの動作は処理系定義とされています(つまり、算術シフトになる保証はない)[1]。
C言語での解説が、C言語編第49章にあります。C++ でも同じです。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |