ビットシフト計算機

整数に左シフト、論理右シフト、算術右シフトを適用し、2進数・10進数・16進数で結果を表示します。

数値を入力し、シフトの種類と量を選ぶだけで、3つの表記でシフト結果をすぐに確認できます。

ビットシフト計算機
整数に左シフト、論理右シフト、算術右シフトを適用し、2進数・10進数・16進数で結果を表示します。

ビットを n だけ左へずらします。数値を 2ⁿ 倍するのと同じです。右側の空いたビットは 0 で埋められます。

ビットシフトについて

ビットシフトは、コンピュータプログラミングとデジタルハードウェア設計における最も基本的な操作のひとつです。ビットシフトでは、2進数のすべてのビットを指定した数だけ左または右へ移動し、一端からはみ出したビットを捨て、反対側の空いた位置をシフトの種類に応じて埋めます。 左シフト演算子(<<)は、すべてのビットを n だけ左へ移動します。左端からはみ出した n ビットは捨てられ、右側に n 個の 0 が追加されます。オーバーフローしない限り、n だけ左シフトすることは整数を 2ⁿ 倍するのと数学的に等価です。たとえば、5(2進数 101)を 2 だけ左シフトすると 20(2進数 10100)になります。これは 5 × 4 = 20 だからです。コンパイラは、2 のべき乗による乗算を左シフトに置き換えることがよくあります。なぜなら、通常は CPU の 1 クロックで実行できるからです。 論理右シフト(>>>)は、すべてのビットを n だけ右へ移動します。右端からはみ出した n ビットは捨てられ、左側に n 個の 0 が追加されます。これは数値を符号なしとして扱い、2ⁿ で割って切り捨てるのと等価です。たとえば、40(2進数 101000)を 3 だけ論理右シフトすると 5(2進数 000101)になります。Java のような言語では、符号なし整数に対する標準的な操作が論理右シフトであるため、>>> が明示的に使われます。 算術右シフト(>>)もビットを n だけ右へ移動しますが、左側には 0 ではなく符号ビット(最上位ビット)を複製します。正の数(符号ビット 0)の場合は 0 が補われ、論理シフトと同じ動作になります。負の数(2 の補数で符号ビット 1)の場合は 1 が補われ、負号が保持されます。たとえば、−16(32ビットの2の補数: ...11110000)を 2 だけ算術右シフトすると −4(2進数 ...11111100)になります。これにより数値の符号が維持され、符号付き整数を 2ⁿ で割って負の無限大方向へ切り捨てるのと等価です。 ビットシフトは、性能が重要なコードで広く使われています。ハッシュ関数、暗号アルゴリズム、画像処理、音声符号化、ネットワークプロトコル解析は、いずれも効率化のためにシフトを利用しています。ハードウェアでは、シフトレジスタが基本回路であり、シリアル通信プロトコル、CRC 生成器、乱数生成やデータスクランブルに使われる線形帰還シフトレジスタ(LFSR)の基礎になっています。

ビットシフトの例

シフトと 2 のべき乗による乗算・除算の関係を示す、よくある操作です。

操作2進数の結果10進数の確認
5 << 2(2だけ左シフト)101005 × 4 = 20 ✓。2だけ左シフトすることは 2² = 4 を掛けるのと同じです。
40 >>> 3(3だけ論理右シフト)10140 ÷ 8 = 5 ✓。3だけ論理右シフトすることは 2³ = 8 での符号なし除算と同じです。
−16 >> 2(2だけ算術右シフト)11111100(−4)−16 ÷ 4 = −4 ✓。算術シフトは符号ビットを保持するため、結果は負のままです。
2進数 1010 << 1(1だけ左シフト)101002進数 1010(10進数 10)は 10100(10進数 20)になります。1だけ左シフトすると値は 2 倍になります。

ビットシフト計算機の使い方

  1. 入力形式を選択します。10進数の整数(負の数も可)を入力する場合は「10進数」、2進文字列を入力する場合は「2進数」を選びます。
  2. 入力欄に数値を入れます。2進入力では、0 と 1 のみを使ってください。
  3. シフトの種類を選択します。「左シフト (<<)」は 2 のべき乗での乗算、「論理右シフト (>>>)」は符号なし除算、「算術右シフト (>>)」は符号付き除算に使います。
  4. シフト量、つまり何ビット移動するか(0〜31)を入力します。
  5. 「シフトを計算」をクリックします。結果は 2進数、10進数、16進数で表示されます。

ビットシフト計算機のFAQ

論理右シフトと算術右シフトの違いは何ですか?
論理右シフトは、空いた上位ビットを常に 0 で埋め、オペランドを符号なしとして扱います。算術右シフトは、空いた上位ビットを符号ビットのコピーで埋めます。正の数では 0、2 の補数表現の負の数では 1 です。非負数では両者は同じ結果になりますが、負の数のときだけ違いが出ます。C/C++ では、符号付き型に対する >> 演算子は、ほとんどのアーキテクチャで算術右シフトを行います。
なぜ左シフトは 2 のべき乗の乗算と等しいのですか?
2進数では、各ビット位置が 2 のべき乗を表します。すべてのビットを 1 つ左へずらすと、それぞれの寄与が 2 倍になるため、値全体が 2 倍になります。n だけ左へずらすと 2ⁿ を掛けるのと同じです。たとえば、6(110₂)を 3 だけ左シフトすると 110000₂ = 48 になり、6 × 8 = 48 です。コンパイラは、乗数が 2 のべき乗定数であれば、この性質を使って高価な乗算命令をより安価なシフト命令に置き換えます。
ビットが端まで移動したらどうなりますか?
レジスタ幅を超えたビットはそのまま破棄されます。左シフトでは、レジスタ幅を超えてあふれた上位ビットが落とされるため、結果が目標型に収まらないと予期しない値になることがあります。右シフトでは、位置 0 を越えた下位ビットが捨てられ、これは 0 方向への切り捨て(論理右シフト)または負の無限大方向への切り捨て(算術右シフト)に相当します。
ビットシフトで割り算はできますか?
はい。n だけ論理右シフトすると、符号なし整数を 2ⁿ で割るのと同じです(小数部分は切り捨て)。n だけ算術右シフトすると、符号付き整数を 2ⁿ で割り、負の無限大方向に丸めます。これは負の数に対する C の整数除算とは同じではありません。たとえば、−7 >> 1 = −4(算術右シフト)ですが、−7 / 2 = −3(C では 0 方向に切り捨て)です。必要に応じて、床関数的な切り捨てか、単純な切り捨てかを選んでください。
最大のシフト量はいくつですか?
32ビット整数では、32ビット以上のシフトは C/C++ では未定義動作であり、ハードウェアでは通常 32 で剰余を取った形で扱われます(n だけシフトすることは n mod 32 だけシフトするのと同じ)。この計算機は 0 から 31 ビットのシフトに対応しており、32ビット範囲をすべてカバーします。それより大きいシフトには、多倍長演算または 64ビット整数型が必要です。
実際のプログラムではビットシフトはどう使われますか?
ビットシフトはさまざまな用途で使われます。整数内のビットフィールドのパック/アンパック(ネットワークパケットヘッダー、ピクセルの色チャネル)、2 のべき乗による高速な乗算・除算、ハッシュ値の計算、AES や SHA などの暗号プリミティブの実装、大きなワードからニブルやバイトを取り出す処理、ビットマスクの計算などです。特定のビットを取り出したり設定したりする必要がある場面では、シフトとビット AND/OR が最適な道具です。