2장 논리 연산
1장에서 논리 게이트를 만들었으니
2장에서는 만들어진 논리게이트들을 조합해 산술논리연산장치(Arithmetic Logical Unit)를 만들 것이다.
ALU는 CPU에서 연산을 담당하는 핵심 부품이다.
먼저 컴퓨터는 항상 모든 연산을 2진수의 덧셈을 통해 처리한다.때문에 우리는 맨 처음 덧셈 연산을 수행해주는 가산기(Adder)를 만들어야 한다.
2진수의 덧셈 연산
예를 들어 10진법 수 2개 15, 6을 덧셈연산한다고 생각해보자
10진수 체계에서의 두 자리 수 덧셈은
한 자리 수 5+6은 1의 올림수가 발생하고, 결과가 1이고,
두 자리 수 1+0은 한 자리 수 덧셈연산에서 발생한 올림 수 1을 추가로 더해 2라는 결과를 출력하고,
최종적으로 21이라는 결과를 출력한다.
코드로 표시하면 이렇게 된다.
그럼 이걸 이진수로 표현하면 어떻게 될까?
우선 두 자리 수 정수이니 8비트 이진 표현법으로 변환해야 한다.
그 후 각 비트의 자릿수들에 대한 덧셈 연산을 수행한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print_bit(int bit) {
printf("%d", bit);
}
void print_bits(int bit1, int bit2, int carry, int step) {
printf("Step %d, bits: ", step);
for (int i = 0; i < 8; i++) {
if (i == 8 - step) {
print_bit(bit1);
}
else {
printf("0");
}
}
printf(" + ");
for (int i = 0; i < 8; i++) {
if (i == 8 - step) {
print_bit(bit2);
}
else {
printf("0");
}
}
if (carry) {
printf(" + ");
for (int i = 0; i < 8; i++) {
if (i == 7 - step) {
printf("1");
}
else {
printf("0");
}
}
}
printf("\n");
}
void print_result(int bit, int carry, int step) {
printf("Step %d, result: ", step);
for (int i = 0; i < 8; i++) {
if (i == 8 - step) {
print_bit(bit);
}
else {
printf("0");
}
}
if (carry) {
printf(" / ");
for (int i = 0; i < 8; i++) {
if (i == 7 - step) {
printf("1");
}
else {
printf("0");
}
}
}
printf("\n");
}
int main() {
// a = 15, b = 6, result = 연산 결과, carry = 올림 수
int a = 15, b = 6, carry = 0;
int a2[8] = { 0 }, b2[8] = { 0 }, result[8] = { 0 };
// 2진수로 변환
for (int i = 7; i >= 0; i--) {
a2[i] = a % 2;
a /= 2;
b2[i] = b % 2;
b /= 2;
}
printf("a2: ");
for (int i = 0; i < 8; i++) {
print_bit(a2[i]);
}
printf("\nb2: ");
for (int i = 0; i < 8; i++) {
print_bit(b2[i]);
}
printf("\n");
// 덧셈 연산하기
for (int i = 7; i >= 0; i--) {
print_bits(a2[i], b2[i], carry, 8 - i);
int temp = a2[i] + b2[i] + carry;
result[i] = temp % 2;
carry = temp / 2;
print_result(result[i], carry, 8 - i);
}
printf("\nFinal result: ");
for (int i = 0; i < 8; i++) {
print_bit(result[i]);
}
return 0;
}
생각보다 그리 간단하지 않다.
이제 덧셈 연산을 해봤으니 뺄셈은 어떻게 하는지 알아보자
생각보다 뺄셈연산은 간단하다
뺄셈 연산을 하는 수(b)를 2의 보수 형태로 2진 비트들을 모두 뒤집은 뒤(0은 1로, 1은 0으로)+1연산을 수행한 뒤 덧셈연산을 하면 된다.
가산기에는 반가산기와 전가산기가 있는데
전가산기는 2개의 반가산기로 구성되어있다.
자세한 내용은 이산수학과 디지털 논리 회로에서 다루겠습니다.
'수학/이산수학' 카테고리의 글 목록 (tistory.com)
'수학/이산수학' 카테고리의 글 목록
Cyphen의 개인 공부 블로그입니다. 프사는 아는 동생이 그려준 그림 주인장과 싱크로율 0%
cyphen156.tistory.com
'수학/디지털 논리 회로' 카테고리의 글 목록 (tistory.com)
'수학/디지털 논리 회로' 카테고리의 글 목록
Cyphen의 개인 공부 블로그입니다. 프사는 아는 동생이 그려준 그림 주인장과 싱크로율 0%
cyphen156.tistory.com
//모든 자료들은 Nand2Tetris홈페이지에서 찾을 수 있습니다.
또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.