ビット演算シミュレーター(AND・OR・XOR・NOT・シフト)

2つの数値に対してAND・OR・XOR・NOT・左シフト・右シフトを計算し、ビットごとの変化を2進数のグリッドで可視化します。8/16/32ビットに対応。

使い方のヒント

  • 値は10進数だけでなく、`0x1A` のような16進数、`0b1010` のような2進数の接頭辞付きでも入力できます。プログラミングで使う表記のまま試せます。
  • AND・OR・XORは2つの値、NOTは1つの値のみを使う演算です。演算を切り替えると入力欄の数が自動的に変わります。
  • 右シフト(>>>)は論理シフトのみに対応しています。符号ビットを考慮する算術シフトとの違いはFAQをご覧ください。
  • ビット幅を8→16→32と変えると、同じ数値でも上位ビットの0の数が増えて見えることを確認できます。ビット幅の概念を理解する助けになります。
  • 黄色くハイライトされたビットは演算前後で変化した桁です。AND・ORでどちらの入力の値が結果に反映されたかを視覚的に追えます。

よくある質問

あります。論理シフト(`>>>`)は空いた上位ビットを常に0で埋めるのに対し、算術シフト(`>>`)は符号ビット(最上位ビット)をそのまま複製して埋めます。本ツールは値をビット幅内の非負整数として扱う教材用途のため、符号という概念を主目的とせず、より理解しやすい論理シフトのみを提供しています。

JavaScriptのビット演算子は内部的に32ビット符号付き整数として計算するため、例えば8ビットの `00000001`(1)にNOTを適用すると通常は `-2` という負の値になります。本ツールは選択したビット幅(8/16/32)でマスクし直しているため、8ビットなら `11111110`(254)のように、そのビット幅の中での正しい表現を表示します。

ANDは「両方のビットが1のときだけ1」になる演算で、特定のビットだけを取り出すマスク処理によく使われます。ORは「どちらかが1なら1」になる演算で、特定のビットを立てる処理に使われます。XORは「異なるビットのときだけ1」になる演算で、値の反転や2値の入れ替えなどに使われます。

左シフト(`<<`)は2倍・4倍のような2のべき乗の掛け算を高速に行う手段として、右シフト(本ツールでは論理シフト)は2で割る処理やビット列から特定の範囲を取り出す処理としてよく使われます。競技プログラミングやビットマスクを使ったアルゴリズムでも頻出です。

厳密には別の言葉です。ビット演算はAND・OR・XOR・NOT・シフトといった演算そのものを指し、ビットマスクはその演算(特にANDやOR)を使って「特定のビットだけを取り出す・書き換える」ための値のことを指します。例えば `value & 0b00001111` は下位4ビットだけを取り出すビットマスクの典型例です。
ツールくん

余談ですが ― XORの不思議な性質と実用例

ビット演算はコンピューターの論理回路にそのまま対応する最も基本的な演算であり、CPUが1クロックで実行できるほど高速です。四則演算よりずっと単純な仕組みで実現できるため、パフォーマンスが重視される場面(画像処理・暗号・ネットワークプロトコルの実装など)では、掛け算や割り算の代わりにビット演算で同等の処理を行うテクニックが古くから使われてきました。

XOR(排他的論理和)には面白い性質があります。同じ値同士のXORは必ず0になり(`a ^ a = 0`)、0とのXORは元の値をそのまま返します(`a ^ 0 = a`)。この2つの性質を利用すると、一時変数を使わずに2つの変数の値を入れ替える「XORスワップ」という古典的なテクニックが成立します(`a ^= b; b ^= a; a ^= b;`)。現代では可読性の観点から実務ではあまり推奨されませんが、ビット演算の性質を学ぶ題材として今でもよく引用されます。

ビットマスクは実務でも幅広く使われています。Unixのファイルパーミッション(読み取り4・書き込み2・実行1の組み合わせ)はビットのORとANDそのものですし、RGBカラーコード `#FF0000` から赤・緑・青の各成分を取り出す処理も、右シフトとANDマスクの組み合わせで実現できます。複数のON/OFFフラグを1つの整数にまとめて管理する「ビットフラグ」というテクニックも、限られたメモリで多くの状態を扱う必要があった古いゲームやシステムのプログラミングで広く使われてきました。