Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

AND演算(アンドエンザン)とは | 意味や読み方など丁寧でわかりやすい用語解説

AND演算(アンドエンザン)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

アンド演算 (アンドエンザン)

英語表記

AND operation (アンド オペレーション)

用語解説

AND演算は、論理演算の一つで、複数の条件が「すべて真(True)」である場合にのみ、結果が真となる基本的な操作だ。コンピュータの世界では、この「真」を1、「偽(False)」を0で表現し、ビットと呼ばれる最小単位の情報に対して演算が行われる。システム内部の様々な処理の根幹をなす概念であり、これを理解することはコンピュータがどのように情報を処理しているかを知る上で非常に重要だ。

AND演算の最も基本的な定義は、二つの入力AとBがあるとき、AもBも共に真(1)である場合にのみ結果が真(1)となり、それ以外のすべての組み合わせでは結果が偽(0)となるというものだ。これを真理値表で表すと、以下のようになる。

入力A入力B結果 (A AND B)
000
010
100
111

この表からわかるように、「AND」という言葉が示す通り、両方の条件が同時に成立しなければ最終的な結果は「真」にはならない。「かつ」という接続詞に近い意味合いを持つと考えると理解しやすいだろう。

コンピュータが扱うデータはすべてビット(0または1)の集まり、すなわちビット列として表現される。AND演算は、このビット列に対して「ビットごと」に行われるのが一般的だ。これは、二つの同じ長さのビット列があった場合、それぞれのビット列の同じ位置にあるビット同士を取り出して、個別にAND演算を実行し、その結果を並べて新しいビット列を作る、という意味である。

具体的な例を挙げてみよう。例えば、二つの数値5と3をAND演算する場合を考える。まず、これらの数値を2進数(ビット列)に変換する。 数値5は2進数で「0101」となる。 数値3は2進数で「0011」となる。 これらのビット列を、同じ桁ごとにAND演算する。

0101 (数値5) & 0011 (数値3)

0001 (結果)

一番右の桁:1 AND 1 は 1 右から二番目の桁:0 AND 1 は 0 右から三番目の桁:1 AND 0 は 0 一番左の桁:0 AND 0 は 0

このようにして得られた「0001」というビット列は、10進数にすると1となる。したがって、5 AND 3 の結果は1となる。

AND演算は、プログラミングやシステム開発のさまざまな場面で利用される。代表的な用途の一つが「特定のビットの抽出(マスク処理)」だ。ある数値の中から、特定のビットだけがどのような状態になっているか(0か1か)を知りたい場合や、特定のビットだけを抜き出したい場合に、AND演算が非常に有効に機能する。このとき、特定のビットを抽出するための「型紙」のような役割を果たすビット列を「マスク」と呼ぶ。

例えば、ある8ビットの数値「10101111」(10進数で175)から、下位4ビット(右側の4ビット)だけを取り出したいとする。この場合、マスクとして下位4ビットだけが1で、残りの上位ビットがすべて0のビット列、「00001111」(10進数で15)を用意する。

10101111 (元の数値) & 00001111 (マスク)

00001111 (結果)

結果は「00001111」となり、元の数値の下位4ビットがそのまま抽出されたことがわかる。上位4ビットはマスクの対応するビットがすべて0だったため、AND演算の結果もすべて0になった。このように、マスクを使うことで必要な部分だけを取り出し、不要な部分を0にクリアすることができる。

もう一つの重要な用途は、「特定のビットが立っているかどうかの判定」である。例えば、コンピュータのハードウェアの状態を表すレジスタの値があり、その中の特定のビットが「エラーが発生している」ことを示すフラグであると仮定する。このフラグが立っているか(ビットが1か)を確認したい場合、フラグが立っているべき位置だけが1であるマスク値とレジスタの値をAND演算する。もし演算結果がマスク値と同じであれば、そのフラグが立っていると判定できる。例えば、レジスタが「10100100」で、エラーフラグが右から3番目のビット(値8のビット、2進数で00001000)だとすると、マスクは「00001000」になる。

10100100 (レジスタ値) & 00001000 (エラーフラグのマスク)

00000000 (結果)

この場合、結果はマスク値と異なるため、エラーフラグは立っていないと判断できる(実際には右から3番目のビットは0だったため)。もしレジスタの値が「10101100」であれば、

10101100 (レジスタ値) & 00001000 (エラーフラグのマスク)

00001000 (結果)

結果がマスク値「00001000」と一致するため、エラーフラグが立っていると判断できる。

プログラミング言語では、AND演算は通常、& (アンパサンド) 記号で表現されることが多い。C言語、Java、C#など、多くの言語でビットごとのAND演算子として&が用いられる。ただし、一部の言語(Pythonなど)では、andというキーワードが論理AND演算(真偽値に対して機能し、条件式などで使われる)に用いられ、ビットごとのAND演算にはやはり&が使われる。初心者は、真偽値を扱う「論理AND」と、数値のビット列を扱う「ビットごとのAND」を混同しないよう注意が必要だ。論理ANDは、A && B(C言語など)や A and B(Pythonなど)のように記述され、結果は真(True)または偽(False)となる。一方、ビットごとのANDは、A & B と記述され、結果は数値となる。

AND演算は、低レベルなハードウェア制御から、ネットワークプロトコルの解析(IPアドレスとサブネットマスクのAND演算によるネットワークアドレスの特定など)、データ圧縮、暗号化アルゴリズム、画像処理など、多岐にわたる分野で基礎的な技術として活用されている。コンピュータシステムのあらゆる層でその応用が見られ、システムエンジニアとして働く上で、この基本的な演算の原理と応用方法をしっかりと理解しておくことは、非常に価値のあるスキルとなるだろう。

関連コンテンツ