c·c++/c 프로그래밍

4비트 2의 보수 연산

바로이순간 2013. 5. 8. 15:58

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