プログラムの1+1=2はどうやって計算するの

技術系

プログラムの基礎は電子回路(ON/OFFの組み合わせ)

ご存じの通りに、プログラムはソフトウェアです。ソフトウェアはハードウェアをコントロールしていることです。それではプログラムの1+1=2はどうやって計算しているのでしょうか。

論理回路

1+1=2は人間の計算結果です。コンピュータは1+1=10(2進数)です。
1+1=10(2進数) はどうやって計算できたのでしょうか。
まずいくつの論理回路をみていきましょう。
論理回路の基礎は高電圧、低電圧、ダイオード、トランジスタ、PNP型、NPN型、N型、P型、Si元素の特徴です。

AND回路

ABA and B
000
010
100
111

OR回路

ABA or B
000
011
101
111

NOT回路

Anot A
01
10

XOR

ABA xor B
000
011
101
110

NAND

ABA nand B
001
011
101
110

NOR回路

ABA nor B
001
010
100
110

半加算器で1+1=10(2進数)に計算できる

ABC | S
000 | 0
010 | 1
100 | 1
111 | 0

C = 0001
S = 0110

C = A’B+AB’=A XOR B, S = A & B


AND回路、OR回路、NOT回路をどのように組み合わせれば、1ケタの2進数の足し算を行う論理回路を作れるでしょうか。

AB(A and B)=C
000
010
100
111
AB(A OR B)=S’?
000
011
101
111
NOT CS’(NOT C AND S’)=S
100
111
111
010

C = 0001S = 0110 はできたのでしょうか。
論理回路の組み合わせに変換すると、下記となります。

1ケタの2進数足し算:半加算器の論理回路構成

半加算器のシミュレーション

JavaScript言語

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>JavaScript Function</title>
	<script>
	function halfAdder(A, B) 
	{
		var temp=[2];
		var C = A & B;//AND回路
		var d = A | B;//OR回路
		var e = ~C;//NOT回路
		var S = d & e;//AND回路
		
		temp[0]=C;temp[1]=S;
		return temp;
	}
	</script>
</head>
<body>
	<h1>1+1=2(10)のJavaScriptシミュレーション</h1>
	<script>
		var A = 0;var B = 0;
		document.write("A=",A,",","B=",B,",","C=",halfAdder(A,B)[0],",","S=",halfAdder(A,B)[1]);
		document.write("<br>\n" );

		var A = 0;var B = 1;
		document.write("A=",A,",","B=",B,",","C=",halfAdder(A,B)[0],",","S=",halfAdder(A,B)[1]);
		document.write("<br>\n" );
		
		var A = 1;var B = 0;
		document.write("A=",A,",","B=",B,",","C=",halfAdder(A,B)[0],",","S=",halfAdder(A,B)[1]);
		document.write("<br>\n" );
		
		var A = 1;var B = 1;
		document.write("A=",A,",","B=",B,",","C=",halfAdder(A,B)[0],",","S=",halfAdder(A,B)[1]);
	</script>
</body>
</html>
halfAdder.htmlの出力結果

C言語

#include<stdio.h>
int* halfAdder(int A, int B);

int main(void)
{
	int* temp; int A, B;
	printf("1+1=2(10)のJavaScriptシミュレーション\n");
	
	A = 0; B = 0;
	temp = halfAdder(A, B);
	printf("A=%d, B=%d, C=%d, S=%d\n", A,B,temp[0],temp[1]);

	A = 0; B = 1;
	temp = halfAdder(A, B);
	printf("A=%d, B=%d, C=%d, S=%d\n", A, B, temp[0], temp[1]);

	A = 1; B = 0;
	temp = halfAdder(A, B);
	printf("A=%d, B=%d, C=%d, S=%d\n", A, B, temp[0], temp[1]);

	A = 1; B = 1;
	temp = halfAdder(A, B);
	printf("A=%d, B=%d, C=%d, S=%d\n", A, B, temp[0], temp[1]);

	return 0;
}

int* halfAdder(int A, int B)
{
	int temp[2];
	int C = A & B;//AND回路
	int d = A | B;//OR回路
	int e = ~C;//NOT回路
	int S = d & e;//AND回路

	temp[0] = C; temp[1] = S;
	return temp;
}
halfAdder.cの出力結果

printf(“A=%d, B=%d, C=%d, S=%d\n”, A, B, temp[0], temp[1]);
↓下記の書き方でも問題がありません。
printf(“A=%d, B=%d, C=%d, S=%d\n”, A,B,*temp,*(temp+1));

(1ケタ+1ケタ)以上の足し算はどうすればよい→全加算器

この加算器はFull Adderと呼ばれ、FAと略して記載します。

4bit加算器

半加算器と全加算器を組み合わせると桁が多くなっても計算することが出来ます。
具体例として5+9の結果を示します。

コメント

タイトルとURLをコピーしました