Logical shift とは

以下も参照してください。ソフトウェア開発の早期段階でテストを有効にする方法について左にシフトする(左)
 コンピュータサイエンスでは、論理シフトは、そのオペランドのすべてのビットをシフトするビット演算です。 2つの基本バリアントは、論理左シフトと論理右シフトです。これは、1だけ左シフトするか、またはnだけ右シフトするなど、所与の値がシフトされるビット位置の数によってさらに変調される。算術シフトとは異なり、論理シフトは数値の符号ビットを保持したり、数値の指数をその仮数(仮数)と区別しません。オペランドの各ビットは、所与の数のビット位置に単純に移動され、空のビット位置は、通常は0で、場合によっては1で埋められる(循環シフトによるコントラスト)。
論理シフトは、オペランドが数値ではなくビットのシーケンスとして扱われる場合によく使用されます。
論理シフトは、2の累乗で符号なし整数の乗算または除算を行う効率的な方法として有用です。符号付きまたは符号なしの2進数にnビットだけシフトすると、2n倍になります。符号なし2進数でnビット右にシフトすると、2n(0に丸める)で除算する効果があります。
論理右シフトは算術右シフトとは異なります。したがって、多くの言語には異なる演算子があります。たとえば、JavaおよびJavaScriptでは、論理右シフト演算子は>>>ですが、算術右シフト演算子は>>です。 (Javaには左シフト演算子()が1つしかありません。なぜなら、論理演算と算術演算による左シフトは同じ効果があるからです。)
ただし、プログラミング言語C、C ++、およびGoには、右シフト演算子が1つしかありません。ほとんどのCおよびC ++の実装では、シフトされる整数のタイプに応じて実行する右シフトを選択します。符号付き整数は算術シフトを使用してシフトされ、符号なし整数は論理シフトを使用してシフトされます。
現在の関連するすべてのC標準(ISO / IEC 9899:1999〜2011)は、シフト数がオペランドのビット数以上で結果が未定義である場合の定義ギャップを残します。これにより、異なる動作を持つネイティブシフト命令を直接使用できるようにすることで、Cコンパイラがさまざまなプラットフォームで効率的なコードを生成できるようになります。たとえば、PowerPCのshift-left-wordは、ビット幅以上のシフトがゼロの場合より直感的な動作を選択しますが、x86のSHLはシフト量を下位ビットにマスクして命令の最大実行時間を短縮しますそのようなビット幅によるシフトは値を変化させない。
.NET FrameworkやLLVMなどの言語の中には、ビット幅以上で不特定(.NET)または未定義(LLVM)にシフトしているものもあります。他の人は、x86動作を指定するC#など、最も一般的なターゲットプラットフォームの動作を指定することを選択します。