The Elements of Computing Systems に沿って基本の論理ゲートを実装している。

8月に取り組むテキストを紹介する - ユユユユユ (https://jnsato.hateblo.jp/entry/2020/08/02/230000)

 NOT, AND, OR, XOR のような耳慣れた論理に加えて、** Multiplexor と Demultiplexor **という耳慣れない回路が、基本の論理ゲートとして扱われていた。そもそも論理ゲートというものを、「2つの入力を1つの出力に合成するもの」のように捉えていた僕にとっては、複数の入出力を持ちうるこれらのゲートは異色の存在に思われた。ノートの書写しにはなるが、TILとして書いておきたい。

multiplexor

 マルチプレクサは、3つの1ビットの入力を受け取り、1つの1ビットの出力を与える。入力のうち1つはセレクタと呼ばれ、このセレクタがフラグとして立っているかどうかで、残りの2つの入力のうちどちらが出力されるかが決定される。

 真理表を書くと次のようになる。

input1 input2 selector output
0 0 0 0 (=input1)
0 1 0 0 (=input1)
1 0 0 1 (=input1)
1 1 0 1 (=input1)
0 0 1 0 (=input2)
0 1 1 1 (=input2)
1 0 1 0 (=input2)
1 1 1 1 (=input2)

 高級言語であれば、IFを使って条件分岐するような処理になる。

bool input1, input2, selector;

// 入力処理

if (selector)
    printf("%d", input2);
else
    printf("%d", input1);

 論理ゲートで実装する上では、こうなる。

demultiplexor

 デマルチプレクサは、2つの1ビットの入力を受け取り、2ビットの出力を行う。今度も2つの入力のうち一方がセレクタであり、セレクタの値によって、出力ビットのどちらに入力ビットを出力するかが決定される。

 真理表は次の通り。

input selector output
0 0 00
0 1 00
1 0 10
1 1 01

 高級言語であれば、さながらこうなるだろう。

bool input, selector;

// 入力処理

if (selector)
    printf("0%d", input);
else
    printf("%d0", input);

 実装はこうなる。