こんにちは、インフラエンジニアです。
最近低レイヤー系技術の動画をよく眺めているのですが、先日以下のような動画をYouTubeで見つけました。
『コンピュータメモリー(RAM)の仕組み』
https://www.youtube.com/watch?v=SSjeGjhwBo0
※興味のある方は見てみて下さい。
この動画での解説の通り、RAMの入出力はNAND演算を用いた論理回路であるNANDゲートによって、電気的な信号を解釈し、データのbitを定義しています。
つまり、この処理が物理と論理の境界になります。
動画の中ではNANDゲートの入出力がかなり分かりやすく図解されています。
そこでふと、自身でビットを入力するような形でRAMのNANDゲートを体感できるようなものができたら面白そうだと思ったので、C言語で再現してみようと思います。
とりあえず今回はNAND演算する処理を作るとこまで。
関数
定義した関数は以下の通り
入力したbitを受け取る関数
入力したbitを受け取る+入力値に誤りがないかのチェック
int get_bit(const char* prompt)
{
int bit;
while (1)
{
printf("%s: ", prompt);
if (scanf_s("%d", &bit) != 1)
{
if (getchar() == '\n')
{
printf("ERROR\n");
}
else
{
while (getchar() != '\n');
}
continue;
}
if (bit == 0 || bit == 1)
{
return bit;
}
else
{
printf("ERROR\n");
while (getchar() != '\n');
}
}
}
NAND演算を行う関数
条件処理でNAND演算を行う
int get_NAND(int a, int b)
{
if (a == 0 && b == 0)
{
return 1;
}
if (a == 1 && b == 0)
{
return 1;
}
if (a == 0 && b == 1)
{
return 1;
}
if (a == 1 && b == 1)
{
return 0;
}
else
{
printf("ERROR");
return -1;
}
}
※本当は↓のように書けるかなと思ったけど、何故かうまくいかなかった。
int get_NAND(int a, int b)
{
return !(a && b); //こちらの方が簡潔
}
コード全様
先述のユーザー定義関数の戻り値を使って、NAND演算の結果を出力してくれます。
#include<stdio.h>
int get_bit(const char* prompt)
{
int bit;
while (1)
{
printf("%s: ", prompt);
if (scanf_s("%d", &bit) != 1)
{
if (getchar() == '\n')
{
printf("ERROR\n");
}
else
{
while (getchar() != '\n');
}
continue;
}
if (bit == 0 || bit == 1)
{
return bit;
}
else
{
printf("ERROR\n");
while (getchar() != '\n');
}
}
}
int get_NAND(int a, int b)
{
if (a == 0 && b == 0)
{
return 1;
}
if (a == 1 && b == 0)
{
return 1;
}
if (a == 0 && b == 1)
{
return 1;
}
if (a == 1 && b == 1)
{
return 0;
}
else
{
printf("ERROR");
return -1;
}
}
int main()
{
int bit_00 = get_bit("ビットを入力 bit_00");
int bit_01 = get_bit("ビットを入力 bit_01");
printf("bit_00 = %d \n", bit_00);
printf("bit_01 = %d \n", bit_01);
int NAND_00 = get_NAND(bit_00, bit_01);
printf("NAND(%d, %d) = %d\n", bit_00, bit_01, NAND_00);
return 0;
}
動作確認
今回は入力値に対して1ビット分のNAND演算の結果を出力するところまでコード化しました。
次回はこれらの処理を組み合わせて、RAMのNANDゲートで行われている処理を再現したいと思います。