#include <stdio.h>
__int64 bin2dec(char a[]);
void tobinstr(char a[], __int64);
int main() {
__int64 n;
int menu=1;
char numstr[100]={0,};
while(menu!=5) {
puts("***********************");
puts("* 1. 2진수 입력: ");
puts("* 2. 10진수 입력: ");
puts("* 3. 8진수 입력: ");
puts("* 4. 16진수 입력: ");
puts("* 5. 끝내기");
puts("***********************");
printf("선택=");
scanf("%d", &menu);
fflush(stdin);
switch(menu) {
case 1:
printf("2진수입력: ");
gets(numstr);
n=bin2dec(numstr);
break;
case 2:
printf("십진수입력: ");
scanf("%lld", &n);
break;
case 3:
printf("8진수입력: ");
scanf("%llo", &n);
break;
case 4:
printf("16진수입력: ");
scanf("%llx", &n);
break;
}
if(menu==5) break;
if(menu>1) tobinstr(numstr, n);
switch(menu) {
case 1:
printf("십진수: %lld 팔진수: 0%llo 16진수 0x%llX\n", n, n, n);
break;
case 2:
printf("이진수: %s 팔진수: 0%llo 16진수 0x%llX\n", numstr, n, n);
break;
case 3:
printf("이진수: %s 십진수: %lld 16진수 0x%llX\n", numstr, n, n);
break;
case 4:
printf("이진수: %s 팔진수: 0%llo 십진수 %lld\n", numstr, n, n);
break;
}
}
return 0;
}
// 주어진 2진수를 나타내는 문자열을 정수로 바꾸는 함수입니다.
__int64 bin2dec(char a[]) {
// 문자열의 인덱스를 위한 변수 i 정수값을 위한 변수 x
__int64 i=0, x=0;
// 문자열의 끝을 만날때 까지 가면서
while(a[i]) {
// 지금까지 읽은(처리한) 문자열 다음에 문자가 나오면 정수의 값은 2배가 되고
// 현재 문자가 '0' 이거나 '1'이냐에 따라서 0이나 1이 더해지게 된다.
x=x*2+a[i]-'0';
i=i+1; // 다음 문자로 가기 위해서 i를 증가시켜준다.
}
return x;
}
// 주어진 정수를 2진수를 나타내는 문자열로 바꾸어 주는 함수이다.
void tobinstr(char a[], __int64 n) {
// i는 문자열의 인덱스를 나타낸다. x는 n의 최대비트의 값에서
// 출발하여 가장 아래 값인 1까지 내려오고 결국은 0이 되어서 끝이 난다.
__int64 i=0, x=1;
// 처음에는 x의 값이 1로 출발하여 2배를 계속해 나간다.
// x의 값이 n의 값 이상이 되면 멈춘다.
while(x<n) x+=x;
// 만약 x의 값이 n의 값보다 크다면 x의 값을 2로 나누어 준다.
// 즉 x는 n의 가장 높은 비트의 값을 가지고 있다.
if(x>n) x=x/2;
// x의 값이 0 보다 클 경우 계속한다.
while(x>0L) {
// 만약 n이 x가 나타내는 비트자리가 있다면 '1'을 없다면 '0'을
// 문자열에 넣어준다.
if(n&x) a[i]='1'; else a[i]='0';
// i의 값을 1증가 시킨다.
i=i+1;
// x를 2로 나누어 준다. 한자리 내려오게 된다.
x=x/2;
}
// a는 문자열이기 때문에 마지막에 널문자를 넣어 준다.
a[i]=0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
c언어에서 인자의 전달에 관하여 (0) | 2012.07.07 |
---|---|
빅 엔디언? 리틀 엔디언? (0) | 2012.07.04 |
세변의 길이를 입력 받아 직각/예각/둔각 삼각형 인지 판별하시오. (0) | 2012.07.02 |
연결리스트 (0) | 2012.06.24 |
정수의 비트표현, 정순과 역순 (0) | 2012.06.16 |