|
제가 2의 보수 변환하는 것을 프로그램상으로 구현해볼려고 했습니다.(이제 막 보수에 대해 디지털회로로 배웠거든요..)
우선 정수를 입력 받아서 2진수로 변환 뒤 0은 1로 1은 0으로 입력받고(이렇게 하면 1의 보수) +1을 해주면 2의 보수가 되겠죠.
이론은 쉽지만 구현이 어렵더군요. ^^;
우선 2진수 변환은 했습니다.(모듈러(나눈 나머지)를 r로 놓고 맨 마지막에 대입하고 나눈값을 뒤에서 더하는 방식으로 하긴 했는데..)
그런데 보수에서 막히네요.
여기 저기 물어봤더니 배열을 사용해야 한다고 하시더군요.
배열로 잡아서 2로 나눈 뒤 1은 0으로 0은 1로 바꿔가며 뒤에서부터 입력한다고 하시더군요.
그래서 이것저것 해봤지만 프로그래밍 지식이 부족해서 어떻게 해야 할지 헤메고 있네요.. ^^;
아래는 제가 짠 소스입니다.
이것저것 하면서 지우고 삽입하고 하다보니 아주 엉망입니다.
2의 보수 구하는 프로그램 좀 자세히 구현을 해주셨으면 진짜 평생 감사히 여기겠습니다.
모처럼 열심히 시도를 해봤는데 막히고 포기할려니...
돌려보시면 정수를 쓰면 보수가 바로 아래에 나오고 2진수변환이 그 아래에 프린트문으로 나옵니다.
문제는 입력수 바로 아래에 나오는 수가 앞에서부터 쓰입니다.
그러니깐 5를 쓰면 1의 보수가 앞에서부터 쓰여서 010 이 나오고 2진수 101 이 나오고..
6을 쓰면 1의 보수가 앞에서부터 쓰여서 100(원래는 001), 2진수 110 이 나옵니다.
8을 쓰면 1의 보수가 앞에서부터 쓰여서 1110(원래는 0111), 2진수 1000 이 나오죠.
지금 뭐가 어떻게 됐는지 저도 모를 정도로 복잡해져버렸습니다.
간단한 주석도 달아주시면 감사하겠습니다. ^^
#include <stdio.h>
#define N 16
void main()
{
char *p, num[N+1] = {0};
int i, r, n1, n2;
while(1)
{
printf("\n정수를 입력하세요(종료:0) : ");
scanf("%d", &n1);
n2 = n1;
if( n1 == 0)
break;
for( i = 0; n1 != 0; i++)
{
r = n1 % 2;
num[N-1-i] = r + '0';
if (r==0)
printf("1");
else
printf("0");
n1 = n1 / 2;
}
p = num+N-i;
printf("\n2진법으로 변환 : %s\n",p);
}
}
|