2의 보수로 표현된 4비트 2진수 A와 2의 보수로 표현된 4비트 2진수 B를 입력받아
두 2진수를 더한 값을 2진수 및 10진수로 출력하는 C 프로그램을 작성하시오.
A와 B가 각각 양수와 양수; 양수와 음수; 음수와 양수; 음수와 음수인 여러 가지
경우에 실행해보시오. 즉 다음의 6가지의 경우에 대해서 실행 결과를 화면 캡쳐해
보고서에 포함하시오.
(+4) + (+3)
(+4) + (-3)
(-4) + (+3)
(-4) + (-3)
(+4) + (+5)
(-4) + (-5)
입력과 출력 포맷의 한 가지 예는 다음과 같다.
Enter input A: 1011
Enter input B: 0101
The result of addition is: 0000B and 0D
#include <stdio.h>
int main() {
char a[8]={0,}, b[8]={0,}, c[8]={0,};
int i, x, n;
printf("Enter Input A: ");
gets(a);
printf("Enter Input B: ");
gets(b);
x=0;
// 4자리의 덧셈을 하는 부분입니다.
// x는 carry (밑자리에서 올라오는 수)입니다.
// 처음에 carry는 0입니다.
// a[3]과 b[3]을 더해주고서 '0'을 빼 줍니다.
// 예를 들어서 '0'+'0'의 결과는 '0'이 되어야 합니다.
// 따라서 '0'을 빼주어야 제대로된 결과가 나옵니다.
// 만약 c[3]이 '2' 또는 '3' 이라면
// 2만큼이 위의 자리로 올라가야 합니다.
// 따라서 '1'보다 크다면 c[3]에서는 2를 빼주고
// carry는 1이 되는 것입니다.
// 이 값이 '0'이나 '1'이면 carry는 0이 됩니다.
for(i=0;i<4;i+=1) {
c[3-i]=a[3-i]+b[3-i]+x-'0';
if(c[3-i]>'1') {
c[3-i]-=2;
x=1;
} else {
x=0;
}
}
// 4자리를 다 구하고 나서 남은 carry 값 x는 버립니다.
// 지금부터 x는 2진수를 나타내는 문자열의 값을 구하는
// 용도로 사용합니다.
// 처음에 x에 0을 넣어줍니다.
x=0;
// 처음에 '1'이라는 문자를 만났다면
// 정수로의 값은 1입니다.
// 하지만 x에 2를 곱해주는 이유는
// 먼저 가지고 있던 값에서
// 한개의 문자가 더 받았다면
// '1' 다음 '0' 을 만났다면 원래 있던 1은 2가 되어야 합니다.
// 왜냐하면 2진수로써 한자리가 늘어나게 되면 그 값이 2배가
// 되기 때문입니다.
// "10" 이면 2가 되고 "11" 이면 3이 되기 때문에
// 원래 가지고 있던 값 1이 두배가 되고 0아나 1이 더해져서
// 2나 3의 값이 되는 것입니다.
// 나중에 "100" 의 경우에는 2가 2배가 되어서 4가 되고
// 0이 더해져서 4로 값이 정해지게 됩니다.
for(i=0;i<4;i+=1) {
x=2*x+c[i]-'0';
}
// 2비트의 경우에 양수의 최대값은 7입니다.
// 2보다 큰 경우에는 음수를 나타내게 됩니다.
// 2의 보수를 해석하는 방법중의 하나가
// (16에서 x만큼을 빼준 수에 -부호를 붙인 수로 해석하는 것입니다.)
// 따라서 x에서 직접 16을 빼주게 되면 음수를 바로 구할 수 있습니다.
if(x>7) {
x-=16;
}
printf("The result of addition is: %sB and %dD\n", c, x);
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
%의 활용 (0) | 2013.05.08 |
---|---|
문자열의 끝을 인식하는 방법 (0) | 2013.05.08 |
1, 2, 3 동작바꾸기 (0) | 2013.05.08 |
greedy knapsack (0) | 2013.05.04 |
산길 내려가는 경로찾기 (0) | 2013.05.04 |