Skip to article frontmatterSkip to article content

ゲート

法政大学

これまではコンピューターにおいて重要な記数法である2進数について学んだ。そして、0と1のビットを使って、数値や文字などのデータを表現する方法についても触れた。

ここでは、2進数の計算を行うための装置であるゲートについて学ぶ。

学習の目標は次の通りである:

ブール演算

ビットは一般的に0または1と表現されるが,FalseまたはTrueという真理値としての表現もよく使われる.

このような真理値(0と1)を扱うための数学的な体系をブール代数(Boolean algebra)と呼ぶ.ブール代数は,イギリスの数学者ジョージ・ブール(George Boole)によって考案された.ブール演算は,AND,OR,NOT,XORなどの論理演算子を使って真偽値を操作する.

ゲート

コンピューターでは,ゲート(gate,論理ゲート,logic gate)と呼ばれる装置を使ってブール演算を実行する.ゲートは,一つまたは複数の入力信号を受け取り,それらの信号を処理して出力信号を生成する.

ここでは,以下の基本的な論理ゲートを紹介する.

これらのゲートをの紹介には,論理式,真理値表,記号を使う.

ORゲート

AABBを真理値とするとき,AABBの論理和(logical disjunction)は,ABA \lor Bと書く.

AABBの少なくとも一方が1のとき,AB=1A \lor B = 1となる.

論理和の真理値表は以下の通りである.

AABBABA \lor B
000
011
101
111

論理和の演算を行うORゲートは次の記号で表現される.

OR Gate

Figure 1:ORゲート

ANDゲート

AABBを真理値とするとき,AABB論理積(logical conjunction)は,ABA \land Bと書く.

AABBの両方が1のとき,AB=1A \land B = 1となる.

論理積の真理値表は以下の通りである.

AABBABA \land B
000
010
100
111

論理積の演算を行うANDゲートは次の記号で表現される.

AND Gate

Figure 2:ANDゲート

NOTゲート

AAを真理値とするとき,AA否定(logical negation)は,¬p\lnot pと書く.

AA1のとき,¬A=0\lnot A = 0となり,AA0のとき,¬A=1\lnot A = 1となる.

否定の真理値表は以下の通りである.

AA¬p\lnot p
01
10

否定の演算を行うNOTゲートは次の記号で表現される.

NOT Gate

Figure 3:NOTゲート

XORゲート

AABBを真理値とするとき,AABB排他的論理和(exclusive or)は,ABA \oplus Bと書く.

AABBのうち一方だけが1のとき,AB=1A \oplus B = 1となる.

排他的論理和の真理値表は以下の通りである.

ABA XOR B
000
011
101
110

排他的論理和の演算を行うXORゲートは次の記号で表現される.

XOR Gate

Figure 4:XORゲート

NANDゲート

AABBを真理値とするとき、AABB否定論理積は、ABA \uparrow Bと書書く。NANDはNot ANDの略で、ANDゲートの出力を否定したものである。

AB=¬(AB)A \uparrow B = \lnot (A \land B)

否定論理積の真理値表は以下の通りである。

AABBABA \uparrow B
001
011
101
110

否定論理積の演算を行うNANDゲートは次の記号で表現される。

NAND Gate

Figure 5:NANDゲート

NORゲート

AABBを真理値とするとき、AABB否定論理和は、ABA \downarrow Bと書く。NORはNot ORの略で、ORゲートの出力を否定したものである。

AB=¬(AB)A \downarrow B = \lnot (A \lor B)

否定論理和の真理値表は以下の通りである。

AABBABA \downarrow B
001
010
100
110

否定論理和の演算を行うNORゲートは次の記号で表現される。

NOR Gate

Figure 6:NORゲート

まとめ

ゲート記号
ANDABA \land B
ORABA \lor B
NOT¬A\lnot A
XORABA \oplus B
NANDABA \uparrow B
NORABA \downarrow B

プログラミング言語での論理演算

C言語では、真理値は整数型で表現され、0は偽(False)、1は真(True)として扱われる。

以下のC言語のコードは,2 > 1が真であり、1を出力する.2 < 1が偽であり、0を出力する.

#include <stdio.h>

int main() {  
  printf("%d\n", 2 > 1); // 1
  printf("%d\n", 2 < 1); // 0
  return 0;
}

Pythonでは,TrueFalseを使って真理値を表現する.

以下のPythonのコードは、2 > 1が真であり、Trueを出力する.2 < 1が偽であり、Falseを出力する.

print(2 > 1)  # True
print(2 < 1)  # False

C言語では、論理和の演算は||演算子を使って表現される.例えば、A || Bは、AAまたはBBのいずれかが真である場合に真を返す.

#include <stdio.h>
int main() {
    int A = 1; // 真
    int B = 0; // 偽
    printf("A OR B = %d\n", A || B); // 出力: 1
    return 0;
}

C言語では、論理積の演算は&&演算子を使って表現される.例えば、A && Bは、AABBの両方が真である場合に真を返す.

#include <stdio.h>
int main() {
    int A = 1; // 真
    int B = 0; // 偽
    printf("A AND B = %d\n", A && B); // 出力: 0
    return 0;
}

C言語では、否定の演算は!演算子を使って表現される.例えば、!Aは、AAが真である場合に偽を返し、AAが偽である場合に真を返す.

#include <stdio.h>
int main() {
    int A = 1; // 真
    printf("NOT A = %d\n", !A); // 出力: 0
    return 0;
}

やってみよう

ユーザーから2つの真理値(0または1)を入力として受け取り、AND、OR、NOT、XORの演算結果を表示するC言語のプログラムを作成してみよう。

作成したプログラムを実行すると、次のような出力が得られる。Enter AEnter Bの後に、0または1を入力することができる。

Please enter A and B, where A and B are either 0 or 1.
Enter A: __1__
Enter B: __0__
A = 1, B = 0

*** Logical Operations ***
A AND B = 0
A OR B = 1
NOT A = 0
A XOR B = 1

解答例

#include <stdio.h>

int main() {
    int A, B;
    printf("Please enter A and B, where A and B are either 0 or 1.\n");
    printf("Enter A: ");
    scanf("%d", &A);
    printf("Enter B: ");
    scanf("%d", &B);
    printf("A = %d, B = %d\n", A, B);

    printf("*** Logical Operations ***\n");
    printf("A AND B = %d\n", A && B);
    printf("A OR B = %d\n", A || B);
    printf("NOT A = %d\n", !A);
    printf("A XOR B = %d\n", A ^ B);
    return 0;
}