This post is not yet available in English and is shown in Korean.
지금까지 0과 1이라는 단순한 신호만으로도 정보를 0과 1로 표현하고 논리적으로 처리할 수 있음을 배웠다. 그리고 논리 게이트들을 조합해 0과 1로 표현된 정보로부터 새로운 정보를 만들어낼 수 있다는 것도 이해했다.
이제 이론에서 벗어나 구체적인 예시를 만나볼 시간이다. 이번 글과 다음 글에서는 논리 게이트를 조합해서 실제로 덧셈을 수행하는 회로를 직접 만들어보자.
스마트폰의 계산기 앱은 사람보다 훨씬 빠르게 덧셈을 한다. 999,999 + 888,888 같은 계산도 순식간에 해낸다. 그런데 그 계산기의 핵심도 결국 우리가 지금까지 배운 논리 게이트들의 조합일 뿐이다.
컴퓨터가 어떻게 덧셈을 하는지 알아보기 전에, 우리가 평소에 어떻게 덧셈을 하는지
돌아보자. 예를 들어 123 + 456을 어떻게 계산할까?
123
+ 456
-----
579
우리는 자연스럽게 오른쪽부터 한 자리씩 계산한다. 만약 한 자리에서 10이 넘는 결과가 나오면 올림을 해서 다음 자리에 더해준다.
올림이 있는 좀 더 복잡한 예를 보자. 179 + 287을 계산해보면:
11 <-- (올림)
179
+ 287
-----
466
9 + 7 = 16이므로 6을 쓰고 1을 올림한다.1 + 7 + 8 = 16이므로 6을 쓰고 1을 올림한다.1 + 1 + 2 = 4이다.이 과정을 잘 보면 두 가지 핵심 요소가 있다:
바로 이 두 가지가 컴퓨터가 덧셈을 하는 핵심 아이디어다. 그런데 컴퓨터는 0과 1만 알고 있지 않은가. 어떻게 이 원리를 0과 1의 세계로 옮길 수 있을까?
일상에서 우리는 총 10개의 숫자를 기본 단위로 삼는 십진법을 사용한다. 십진법에서는 각 자리 숫자에 1, 10, 100, 1000처럼 점점 10배씩 커지는 값을 곱해서 전체 숫자를 만든다. 예를 들어, 숫자 123을 자세히 뜯어보면 이렇게 해석할 수 있다:
1 × 100 +
2 × 10 +
3 × 1
=
1 × 102 +
2 × 101 +
3 × 100
즉, 가장 왼쪽 자리는 100의 자리, 가운데는 10의 자리, 마지막은 1의 자리를 뜻하는 것이다. 자리값을 이용한 표현 방식이다.
사실 컴퓨터도 똑같은 원리를 사용한다. 단지 숫자를 표현할 때 0과 1, 두 개의 숫자만 사용할 뿐이다. 그래서 자리가 늘어날 수록 10배가 아닌 2배씩 커지는 값을 곱한다. 이를 이진법이라고 한다.
예를 들어, 이진법으로 나타낸 이진수 1012을 십진수로 바꾸면 이렇게 된다:
1 × 22 +
0 × 21 +
1 × 20
= 1 × 4 +
0 × 2 +
1 × 1
= 4 + 0 + 1 = 5
10
이렇게 이진수로 표현한 수를 논리 게이트들로 처리하면 새로운 의미있는 수를 만들 수 있다.
먼저 간단한 예부터 시작해보자.
십진수 310 + 110 = 410를 이진수 버전으로 계산해보면 112 + 012 = 1002가 된다.
11 <-- (올림)
11
+ 01
-----
100
결과적으로 100₂가 나오고, 이는 십진수 4와 같다.
이 과정에서 핵심은 십진수 때와 마찬가지로 각 자리에서 발생하는 두 가지 결과다:
이제 본격적으로 덧셈 회로를 만들어보자. 한 자리 이진수 두 개를 더하는 가장 간단한 경우를 생각해보자.
가능한 모든 경우를 나열해보면:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10
마지막 경우가 흥미롭다. 1 + 1은 102이 된다. 즉, 현재 자리 결과(Sum)는 0이고 다음 자리로 넘어가는 올림(Carry)은 1이 발생하는 것이다.
진리표를 보면 Sum은 A와 B가 다를 때만 1이 되고, Carry는 A와 B가 모두 1일 때만 1이 된다.
| Sum | Carry | ||
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
위의 진리표를 논리 게이트로 구현하면 한자리수 이진수 덧셈을 할 수 있는 계산기를 만든 것이다. 이전 글에서 배운 대로 NAND 게이트만으로 구현하면 아래와 같다.
이 회로를 반가산기(Half Adder) 라고 한다. 이후 논의에서는 간결함을 위해 이를 하나의 블록으로 묶어 HALF ADDER로 표기한다.
반가산기는 한 자리 이진수 두 개의 덧셈만 처리할 수 있다. 하지만 실제 덧셈에서는 아래 자리에서 올라온 올림값도 함께 처리해야 한다. 다음 글에서는 이 문제를 해결하는 전가산기를 만들고, 여러 자리 덧셈까지 확장해보자.