piapia123
ja

ビット演算

変換

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

10 種類のビット演算を 1 つのツールにまとめているのは、入出力の形がまったく同じで違うのは演算子だけだからです —— 10 ページに分けると内容がほぼ同一になり、検索でも互いに薄め合います。 なぜ言語標準のビット演算子を使わないのか。 JavaScript の `&` `|` `^` `~` `<<` `>>` はまず 32 ビット符号付き整数に変換します:`1 << 31` は `-2147483648`、`0xFFFFFFFF` は `-1`、32 ビットを超える値は黙って切り詰められ、しかもエラーは出ません。ビット演算を必要とする場面で扱うのは 64 ビットのマスク、ハッシュの断片、UUID から取り出した整数などで、それらはすべて誤った結果になります。ここでは全体を通して BigInt を使うため、`<<` はいくらでもシフトでき、`&` が突然負になることもありません。 ビット幅は剰余と表示の口径です。 32 ビットを選ぶと、オペランドはまず 2³² で剰余を取られ(`-1` はすべて 1 になり、これが 2 の補数の意味です)、結果は 32 ビットにゼロ埋めして表示されます。「無制限」ではどちらも行わず、`~0` は `-1` になります —— 数学的には正しいのですが、マスクを扱う人には望ましくないため、既定は 32 ビットです。

機能

  • 10 種類:AND・OR・XOR・XNOR・NAND・NOR・NOT・左シフト・右シフト・ビット逆順
  • 結果は 10 進・2 進・16 進・ビット数を同時に表示し、行ごとにコピーできます
  • 入力は 0b / 0o / 0x と 10 進数に対応。`_` と空白は区切りとしてそのまま貼れます
  • ビット幅は 8 / 16 / 32 / 64、または「無制限」(BigInt の任意精度)
  • ビット幅を指定すると先に 2 の補数で剰余を取ります:8 ビットの `-1` は 255 になります
  • 左シフトが負の数にオーバーフローしません(JavaScript の `1 << 31` は負になります)
  • 1 行に 1 オペランドなので、同じマスクを一覧全体に適用できます
  • 64 ビットのマスクや巨大な整数でも正確。浮動小数点は一切通りません

使い方

  1. 演算したい数を 1 行に 1 つ貼り付けます(0b / 0o / 0x に対応)
  2. 演算とビット幅を選び、2 つ目のオペランドを入力します
  3. 結果は即座に更新されます。行のコピーボタンで値を取り出します

よくある質問

コードで計算した結果と違うのはなぜですか?
多くの場合、言語のビット演算子は 32 ビット符号付き整数で動作するためです。典型的な違いは 3 つあります。`1 << 31` は向こうでは `-2147483648`、ここでは `2147483648`。`0xFFFFFFFF` は向こうでは `-1` として読まれます。32 ビットを超えるオペランドは黙って切り詰められます。ビット幅を「無制限」にすれば切り詰めのない結果が見られ、32 ビットにすれば符号なし表示を除いて言語の挙動と一致します。
ビット幅はどれを選べばよいですか?
対象環境のデータ幅に合わせてください。C の int や JavaScript のビット演算なら 32 ビット。uint8 配列、RGB チャンネル、プロトコルのフィールドなら 8 か 16 ビット。64 ビットのマスクやハッシュなら 64 ビット。数学的な答えだけ知りたいなら「無制限」です。ビット幅が影響するのは剰余とゼロ埋めの 2 段階だけで、演算そのものの正しさには関わりません。
右シフトは算術ですか、論理ですか?
論理(符号なし)です。ビット幅を指定するとオペランドはすでに剰余を取られており、すべて非負なので符号拡張するものがありません。したがって `0xFFFFFFFF >> 4` は `0x0FFFFFFF` になります。算術シフトが必要な場合(負の数の符号ビットを保つ)はビット幅を「無制限」にしてください。そこでは BigInt の `>>` が負の数に対して算術シフトになります。

関連ツール