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

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

ビット演算とは

ビット演算とは、数値を2進数(0と1の並び)として捉え、桁ごとに論理演算を行う計算方法です。AND(論理積)・OR(論理和)・XOR(排他的論理和)・NOT(否定)・シフト演算(左シフト・右シフト)の5種類が代表的で、いずれもCPUが直接実行できる基本命令のため、四則演算よりも高速に処理できます。プログラミング言語では `&`・`|`・`^`・`~`・`<<`・`>>` といった記号で書かれることが多く、フラグ管理や権限設定、暗号処理、画像処理などさまざまな場面で使われています。

このツールでは、値A・値B(NOTのみ値Aだけ)とビット幅(8/16/32ビット)を指定し、選んだ演算の結果をビットごとのグリッドで確認できます。値は10進数のほか `0x` 接頭辞の16進数、`0b` 接頭辞の2進数でも入力できるため、プログラミングでの表記のまま試すことが可能です。ビット幅を超える値は正しく扱えないため、入力前にどのビット幅を使うか決めておくと結果を理解しやすくなります。

ビット演算シミュレーターの使い方

  1. ビット幅を選ぶ 8・16・32ビットの中から、扱いたい値の範囲に合わせて選択します。迷う場合はまず8ビットで試すと桁の変化が見やすくなります。
  2. 演算の種類を選ぶ AND・OR・XOR・NOT・左シフト・右シフトの中から確認したい演算を選びます。NOTを選ぶと入力欄が1つに切り替わります。
  3. 値を入力する 値A(NOT以外は値Bも)を10進数・16進数(`0x`)・2進数(`0b`)のいずれかの形式で入力します。シフト演算の場合はシフトするビット数も指定します。
  4. 結果のグリッドを確認する 入力すると自動的に演算結果が計算され、ビットごとの0/1が表示されます。黄色でハイライトされた桁が、演算によって変化したビットです。
  5. 10進数・16進数の表記も見比べる 結果行の下に10進数・16進数の値が併記されるため、2進数のグリッドと数値表記を行き来しながら理解を深められます。

使いこなすためのヒント

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

ビット演算の活用シーン

プログラミング学習でのビット演算の確認

C言語・Java・Pythonなどでビット演算子を初めて使うとき、頭の中の計算と実際の結果が合っているかをこのツールで検算できます。特にNOTやシフト演算は暗算しにくいため、視覚的な確認が理解を助けます。

ビットフラグ・権限設定の設計

Unixのファイルパーミッションや、複数のON/OFF状態を1つの整数にまとめる「ビットフラグ」を設計する際、ANDでマスクを取り出す・ORでフラグを立てるといった操作をこのツールで事前に試せます。

競技プログラミング・アルゴリズムの検証

ビットマスクを使った動的計画法や集合の表現など、競技プログラミングで頻出のテクニックを学ぶ際に、小さな値で演算結果を確かめながら理解を進められます。

16進数・2進数の相互変換の確認

16進数や2進数で書かれた値が10進数でいくつになるかを、演算と同時に確認したい場合にも利用できます。基数変換ツールと組み合わせるとさらに理解が深まります。

色コード・ネットワークアドレスの計算

RGBカラーコードからの成分抽出や、IPアドレスとサブネットマスクのAND計算など、実務でビット演算が使われる場面を、事前に手元で試算する用途にも使えます。

ビット演算 用語集

AND(論理積)
2つのビットがともに1のときだけ結果が1になる演算です。特定のビットだけを取り出す「マスク処理」によく使われます。
OR(論理和)
2つのビットのどちらかが1であれば結果が1になる演算です。特定のビットを1に立てる処理に使われます。
XOR(排他的論理和)
2つのビットが異なるときだけ結果が1になる演算です。値の反転や差分の検出、一時変数を使わない値の入れ替えなどに使われます。
NOT(否定)
1つの値のすべてのビットを反転させる演算です。0は1に、1は0になります。結果はビット幅によって表現が変わります。
シフト演算
ビット列全体を左または右にずらす演算です。左シフトは2倍・4倍のような2のべき乗の掛け算、右シフトは2で割る処理に相当します。
ビットマスク
ANDやORと組み合わせて、特定のビットだけを取り出したり書き換えたりするために使う値です。例えば下位4ビットだけを取り出す場合は `0b00001111` を使います。
ビット幅
1つの値を表現するのに使うビットの桁数です。8ビットなら0〜255、16ビットなら0〜65535までの非負整数を表せます。
2進数・16進数
2進数は0と1だけで数を表す記数法、16進数は0〜9とA〜Fで表す記数法です。ビット演算では2進数のまとまりを16進数で短く表記することがよくあります。

よくある質問

あります。論理シフト(`>>>`)は空いた上位ビットを常に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つの整数にまとめて管理する「ビットフラグ」というテクニックも、限られたメモリで多くの状態を扱う必要があった古いゲームやシステムのプログラミングで広く使われてきました。