ビット演算とシフトの計算
【ご注意】このページの計算結果・情報は参考値です。正確性・最新性は保証できません。税務・法務・お金・設計・施工・安全などに関わる判断は、公式の資料と専門家の確認のうえ、ご自身の責任で行ってください。免責事項
2つの数のAND・OR・XOR・NOTと左右のビットシフトを同時に計算し、2進数の並びを4桁ごとに区切って表示します。マスク処理やフラグの操作、シフトが掛け算・割り算に対応することを目で確かめられます。
ビット演算とシフトの計算ツール
4つの演算
ビット演算は2進数の同じ位置どうしを1桁ずつ比べます。AND は両方が1のときだけ1、OR はどちらかが1なら1、XOR は異なるときだけ1、NOT は0と1をすべて反転します。既定値の A=204(1100 1100)と B=170(1010 1010)では、AND が 1000 1000=136、OR が 1110 1110=238、XOR が 0110 0110=102 になります。
シフトはビットの並びを左右にずらす操作です。左に1つずらすと各桁の重みが2倍になるので値も2倍、右に1つずらすと2で割って小数を切り捨てた値になります。2ビット左にシフトすれば4倍です。掛け算や割り算より速く処理できるため、古くから使われてきました。ただし左シフトでビット幅からあふれた分は消えるので、桁あふれに注意が必要です。
ビット演算の真理値表
| A | B | AND | OR | XOR | NOT A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
実務でのよくある使い方
| やりたいこと | 書き方 | 意味 |
|---|---|---|
| 特定のビットを取り出す | 値 AND マスク | マスクで1にした桁だけ残す |
| 特定のビットを立てる | 値 OR マスク | マスクで1にした桁を1にする |
| 特定のビットを反転する | 値 XOR マスク | マスクで1にした桁だけ反転 |
| 特定のビットを落とす | 値 AND (NOT マスク) | マスクで1にした桁を0にする |
| 2ⁿ倍する | 値 を左へ n シフト | 掛け算より速い |
| 2ⁿで割る(切り捨て) | 値 を右へ n シフト | 割り算より速い |
| 偶数か判定する | 値 AND 1 が0か | 最下位ビットを見る |
| 2つの値を交換する | XOR を3回 | 一時変数が要らない |
マスクの作り方(8ビット)
| 目的 | 2進数 | 10進数 | 16進数 |
|---|---|---|---|
| 最下位ビットだけ | 0000 0001 | 1 | 0x01 |
| 下位4ビット | 0000 1111 | 15 | 0x0F |
| 上位4ビット | 1111 0000 | 240 | 0xF0 |
| 3番目のビットだけ | 0000 0100 | 4 | 0x04 |
| すべて | 1111 1111 | 255 | 0xFF |
※入力した文字列はお使いのブラウザの中だけで処理され、サーバーには送信されません。結果は参考です。業務システムへの適用にあたっては、実装側の仕様をご確認ください。
ビット演算とシフトの計算の詳しい解説
ビット演算は、数を数として扱うのではなく、0と1が並んだ旗の列として扱う操作です。同じ位置のビットどうしを1桁ずつ比べるだけなので、計算そのものは極めて単純で、コンピュータにとっては足し算より速い処理になります。用途は大きく2つあり、ひとつは複数の真偽値をまとめて1つの数に詰め込むフラグ管理、もうひとつは数値の特定の部分だけを取り出したり書き換えたりするマスク処理です。
フラグ管理の考え方はこうです。8つの設定項目があるとき、それぞれを別の変数に持つ代わりに、1バイトの各ビットに割り当てます。1番目の設定を有効にしたければ OR で該当ビットを1にし、無効にしたければ AND と反転マスクで0にします。ある設定が有効かを調べるには AND を使い、結果が0でなければ立っている、と判断します。ファイルの権限や、機器の状態を表すステータスレジスタは、この方式で作られています。
マスク処理は、数値の一部だけを扱いたいときに使います。色を表す 0xFF8800 という値から緑の成分だけを取り出したければ、8ビット右にシフトしてから 0xFF と AND を取ります。シフトで目的の位置まで持ってきて、マスクで余分を切り落とす、という2段構えが定石です。IPアドレスとサブネットマスクの関係も同じで、AND を取ることでネットワーク部だけが残ります。
XOR には独特の性質があります。同じ値で2回 XOR すると元に戻るため、簡易な暗号や、一時変数を使わない値の交換に使われてきました。また、あるビットだけを反転させたいときにも便利です。ただし暗号として使うには弱すぎるため、本格的な秘匿には使えません。チェックサムやパリティの計算で使われるのは、この可逆性と計算の軽さのためです。
シフトで注意すべきは、あふれた分が消えることです。8ビットの箱で 1100 1100 を2つ左にシフトすると、左端の 11 は箱から出て失われ、0011 0000 になります。値としては 204×4=816 のはずが 48 になってしまいます。掛け算の代わりにシフトを使うときは、結果がビット幅に収まるかを必ず確認してください。右シフトでは逆に、あふれるのではなく小数部分が切り捨てられます。負の数を扱う場合は、符号ビットをどう扱うかで算術シフトと論理シフトに分かれ、言語によって既定の動作が違う点にも注意が要ります。
業界・現場での使い方
設定フラグの管理
複数の真偽値を1つの数に詰め、OR で立てて AND で判定します。
色の成分の取り出し
シフトとマスクを組み合わせて、RGB の各成分を個別に取り出します。
ネットワークの計算
IPアドレスとサブネットマスクの AND でネットワーク部を求めます。
組み込み機器の制御
レジスタの特定ビットだけを読み書きして、機器の状態を操作します。
よくある間違い・注意点
- 左シフトで桁あふれに気づかない — ビット幅からあふれた分は消えます。204を8ビットで2つ左にシフトすると48になります。
- AND と OR を取り違える — ビットを取り出すのは AND、立てるのは OR です。
- ビットを落とすのに AND と NOT を忘れる — 落とすときは AND (NOT マスク) です。OR では落とせません。
- XOR を暗号として使う — 同じ鍵で繰り返すと簡単に破られます。本格的な秘匿には使えません。
- 負の数の右シフトを言語共通だと思う — 算術シフトと論理シフトがあり、言語や型で動作が違います。
関連する規格・公的資料
- Unicode コンソーシアム — Unicode の規格と符号位置の定義
- W3C(World Wide Web Consortium) — HTML の文字参照と仕様
- WHATWG HTML Standard — 名前付き文字参照の一覧と解釈の規定
- WHATWG Encoding Standard — ブラウザが扱う文字エンコードの仕様
- IETF(RFC の発行元) — RFC 3629(UTF-8)などの規格
- ITU(国際電気通信連合) — 国際モールス符号の勧告 ITU-R M.1677
- 総務省 電波利用ホームページ — 無線従事者・和文モールスの制度
- 日本産業標準調査会(JISC) — JIS X 0201・JIS X 0208 など文字集合の規格
- 日本規格協会(JSA) — JIS 規格票の発行
- 情報処理推進機構(IPA) — 文字情報基盤と安全な実装の手引き
- MDN Web Docs — parseInt・codePointAt などの仕様解説
- IEEE — 浮動小数点や整数表現の標準
- JIS X 0001(情報処理用語・論理演算) — AND・OR・XOR の定義
- MDN ビット演算子 — JavaScript でのビット演算の仕様
- IEEE(整数の表現) — 符号付き整数とシフトの扱い
※本ツールは公的基準に基づく参考計算です。医療・法務・税務の判断は最新の告示・規格および専門家の判断に従ってください。
よくある質問(FAQ)
AND と OR の違いは何ですか?
AND は両方が1のときだけ1、OR はどちらかが1なら1です。取り出すのが AND、立てるのが OR です。
既定値の計算結果は?
A=204(1100 1100)とB=170(1010 1010)で、AND が136、OR が238、XOR が102 になります。
左シフトは何倍になりますか?
1つで2倍、n個で2ⁿ倍です。ただしビット幅からあふれた分は消えます。
右シフトは割り算ですか?
2ⁿで割って小数を切り捨てた値になります。
特定のビットだけ0にするには?
AND と反転したマスクを使います。OR では0にできません。
立っているビットの数を数えるのは何に使いますか?
誤り検出のパリティや、集合の要素数を数える用途があります。
XOR で値を交換できるのはなぜですか?
同じ値で2回 XOR すると元に戻る性質があるためです。一時変数が要りません。
マスクはどう作りますか?
取り出したい桁を1にした数です。下位4ビットなら 0x0F、上位4ビットなら 0xF0 です。
負の数も計算できますか?
このツールは0以上を対象にしています。負の数は2の補数として進数変換ツールで確認してください。