ビット演算の基礎|AND・OR・XOR・NOT・シフト・マスクをやさしく解説
ビット演算は、数を「0と1の並び」として直接操作する、コンピュータの最も基本的な計算です。本記事では、AND・OR・XOR・NOTの論理演算から、左シフト・右シフト、特定のビットを立てる/落とすテクニック、マスクとフラグ管理、2の累乗との関係、そして権限管理や色・最適化といった実用例までをやさしく解説します。
プログラミングを学んでいると、&や|、^、<<といった見慣れない記号に出会うことがあります。これらはビット演算と呼ばれる、数値を「0と1の並び」として直接操作する計算です。普段の足し算や掛け算とは少し違う考え方が必要ですが、仕組みを理解すれば、権限管理やフラグの保存、高速化など、さまざまな場面で強力な武器になります。本記事では、ビット演算の基礎を順を追って解説します。
ビット演算とは何か
コンピュータは、あらゆる数を2進数、つまり0と1の並びで扱います。たとえば10進数の「13」は、2進数では「1101」です。この一つひとつの桁をビット(bit)と呼びます。ビット演算とは、このビットの並びに対して、桁ごとに直接処理を行う計算のことです。
私たちが普段使う足し算や掛け算は「数全体の大きさ」を扱いますが、ビット演算は「どの桁が0でどの桁が1か」という個々のビットそのものに注目します。そのため、最初は感覚がつかみにくいかもしれません。実際の値で確かめながら学ぶのが近道で、基数変換ツールで10進数を2進数に変換しながら読み進めると、桁の対応がイメージしやすくなります。
ビット演算が活躍するのは、メモリを節約したいとき、複数のオン・オフ状態をまとめて管理したいとき、そして処理を高速にしたいときです。1つの整数の中に何十個もの「はい/いいえ」を詰め込めるため、データを非常にコンパクトに表現できるのが大きな利点です。
AND・OR・XOR・NOTの4つの論理演算
ビット演算の中心となるのが、AND・OR・XOR・NOTという4つの論理演算です。いずれも、対応する桁どうしを1ビットずつ比べて結果を決めます。それぞれの動きを真理値表で見てみましょう。
| A | B | AND (A&B) | OR (A|B) | XOR (A^B) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
- AND(論理積、
&):両方のビットが1のときだけ1になります。「どちらも成り立つか」を調べる演算で、後述するマスク処理の主役です。 - OR(論理和、
|):どちらか一方でも1なら1になります。複数のフラグをまとめて立てる(オンにする)ときに使います。 - XOR(排他的論理和、
^):2つのビットが異なるときだけ1になります。「同じか違うか」を判定でき、ビットの反転や入れ替えに便利です。 - NOT(否定、
~):1つの値の全ビットを反転します。1は0に、0は1になります。
たとえば、12(2進数で1100)と10(同1010)のANDを取ると、両方が1の桁だけが残って1000、つまり8になります。同じ2つの値でORを取れば1110で14、XORなら0110で6です。慣れるまでは紙に2進数を書いて桁を揃えると分かりやすく、答え合わせにはビット演算計算ツールを使うと、入力した値の演算結果を2進数と10進数の両方ですぐ確認できます。
左シフトと右シフト:2の累乗との関係
論理演算と並んで重要なのがシフト演算です。これは、ビットの並び全体を左右にずらす操作で、10進数の世界で位を動かす感覚に近いものです。
左シフト(<<)は、ビットを左へずらし、空いた右側を0で埋めます。これは数値を2倍することに相当します。1ビット左へずらせば2倍、2ビットなら4倍、nビットなら2のn乗倍です。たとえば3 << 2は、3(2進数で11)を2桁左にずらして1100、つまり12になります(3×4=12)。
右シフト(>>)は逆に、ビットを右へずらします。これは数値を2で割って小数点以下を切り捨てることに相当します。13 >> 1なら、13(1101)を1桁右にずらして110、つまり6です(13÷2=6.5の切り捨て)。
ここで見えてくるのが、ビット演算と2の累乗の深い結びつきです。各ビットはそれぞれ「1、2、4、8、16…」という2の累乗の重みを持っており、1 << nと書けば「下からn番目のビットだけが1である値」、すなわち2のn乗が得られます。この性質は、次に説明する「特定のビットを操作する」テクニックの土台になります。シフトの結果がどんな値になるかは、基数変換ツールで2進数表示を見比べると一目で理解できます。
ビットを立てる・落とす・反転する
ビット演算の真価は、整数の中の特定の1ビットだけを自由に操作できる点にあります。ここでは代表的な3つの操作を紹介します。いずれも、操作したい位置のビットだけが1になった値(1 << n)を組み合わせて実現します。
- ビットを立てる(オンにする):
値 | (1 << n)。ORを使い、n番目のビットを1にします。他のビットはそのまま保たれます。 - ビットを落とす(オフにする):
値 & ~(1 << n)。n番目だけが0で他がすべて1のマスクとANDを取り、n番目を0にします。 - ビットを反転する(トグル):
値 ^ (1 << n)。XORを使い、n番目が1なら0に、0なら1に切り替えます。
さらに、特定のビットが立っているかを調べるには値 & (1 << n)を計算し、結果が0でなければそのビットは1だと分かります。これらはどれも、対象のビット以外には一切影響を与えないのが重要なポイントです。実際に値を入れて挙動を確かめたいときは、ビット演算計算ツールでANDやOR、XORを試し、どの桁が変化したかを観察してみてください。
マスクとフラグ管理
これまでのテクニックを組み合わせると、1つの整数で複数のオン・オフ状態をまとめて管理することができます。この「対象のビットだけを取り出す・操作するためのパターン」をマスク(ビットマスク)と呼びます。
たとえば、ある機能の設定として「通知オン」「ダークモード」「自動保存」の3つのスイッチがあるとします。これらにそれぞれ1、2、4という2の累乗の値を割り当てておけば、3つの状態を1つの整数にまとめられます。「通知オン(1)」と「自動保存(4)」だけが有効なら、ORでまとめて1 | 4 = 5。この5という値を保存しておくだけで、3つの設定すべてを表現できるのです。
状態を読み出すときはANDを使います。5 & 2は0なので「ダークモードはオフ」、5 & 4は0以外になるので「自動保存はオン」と判定できます。このように、各状態に2の累乗を割り当て、ORで設定し、ANDで確認するのがフラグ管理の基本形です。データベースのカラムや設定ファイルを1つの数値で済ませられるため、保存領域を大きく節約できます。複数のマスクを同時に確認したいときはビット演算計算ツールが便利で、値を2進数で並べて見れば、どのフラグが立っているか直感的に把握できます。
何に使うのか:権限・色・最適化
ビット演算は、抽象的に見えて実際のソフトウェアのあちこちで使われています。代表的な用途を3つ紹介します。
1. 権限管理(パーミッション)
もっとも有名な例が、ファイルやユーザーの権限管理です。Unix系OSのファイル権限「読み取り(4)」「書き込み(2)」「実行(1)」は、まさに2の累乗を割り当てたフラグです。「読み取り+書き込み」なら4 + 2 = 6のように、複数の権限を1つの数値で表します。Webアプリの役割(ロール)管理でも、同じ考え方で「閲覧」「編集」「削除」などの権限をビットで持たせる設計がよく使われます。
2. 色(RGBA)の表現
画面の色は、赤・緑・青・透明度(アルファ)の各成分を0〜255の値で表し、これらを1つの整数に詰め込んで扱うことがよくあります。各成分は8ビットを占めるので、シフトとマスクを使えば、1つの整数から特定の色成分だけを取り出したり、逆に成分を組み立てたりできます。(色 >> 16) & 0xFFで赤成分を取り出す、といった処理はその典型です。
3. 最適化・高速化
ビット演算はCPUにとって非常に軽い処理のため、高速化の手段としても使われます。たとえば「2で割る」より「1ビット右シフト」、「2のべき乗で割った余り」より「AND演算」のほうが速いことがあります。また、多数のオン・オフを整数1つにまとめれば、メモリ使用量とアクセス回数を大きく減らせます。こうした最適化は、ゲームや組み込み機器、大規模データ処理など、性能が重視される分野で今も現役です。
ビット演算は、数を0と1の並びとして捉え、桁ごとに操作するというシンプルな発想の上に成り立っています。AND・OR・XOR・NOTの4つとシフトさえ押さえれば、フラグ管理から権限・色・最適化まで幅広く応用できます。まずはビット演算計算ツールで実際に演算を試し、基数変換ツールで2進数表示を確かめながら、ビットがどう動くのかを目で見て理解していきましょう。
なお本記事は一般的な情報の提供を目的としたものです。シフトの挙動(符号付き・符号なしの違いなど)や演算子の仕様は、使用するプログラミング言語によって細部が異なります。実装の際は、最新の公式ドキュメントや言語仕様を必ず確認してください。
よくある質問
ビット演算とは何ですか?
ビット演算とは、数値を2進数(0と1の並び)として捉え、その桁(ビット)ごとに直接処理を行う計算です。代表的なものにAND・OR・XOR・NOTの論理演算と、左シフト・右シフトがあります。複数のオン・オフ状態を1つの整数にまとめたり、処理を高速化したりする目的で広く使われます。
AND・OR・XORはどう使い分けますか?
ANDは両方のビットが1のときだけ1になり、特定ビットの取り出し(マスク)や状態の確認に使います。ORはどちらか一方でも1なら1になり、フラグを立てる(オンにする)のに使います。XORは2つのビットが異なるとき1になり、ビットの反転(トグル)や入れ替えに便利です。
左シフトと右シフトは何をする演算ですか?
左シフト(<<)はビットを左へずらし、数値を2倍します。nビットずらせば2のn乗倍です。右シフト(>>)はビットを右へずらし、2で割って切り捨てる動きになります。各ビットが2の累乗の重みを持つため、シフトは掛け算・割り算の高速な代替になることがあります。
ビットマスクやフラグ管理とは何ですか?
各状態に1、2、4、8…という2の累乗の値を割り当て、ORで複数の状態をまとめて1つの整数に保存し、ANDで個々の状態を確認する手法です。これにより、多数のオン・オフ設定を1つの数値で表現でき、保存領域を節約できます。Unixのファイル権限などが代表例です。
WAZA TOOLSのビット演算計算ツールはデータを保存しますか?
いいえ。WAZA TOOLSのビット演算計算ツールや基数変換ツールはすべてブラウザ内で処理され、入力した値がサーバーに送信・保存されることは一切ありません。スマートフォンでも利用でき、何度でも無料でお使いいただけます。