C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50560] Re:질문이요.
장성호 [nasilso] 1440 읽음    2007-09-14 01:07
[기본개념]

입력을 받으면 char 버퍼에 들어가겠죠

만약 "101" 을 입력받았다고 합시다

이것을

2진수로 보면  10진으로 5일것이구
8진으로 보면  10진으로 65일것이구
10진은 그대로                101
16진을            10진으로  257이 됩니다.

이걸 어떻게 계산하는가 하는것이 질문일것인데요

10진이든 6진이든 2진이든..   X진법이라고 할때
자릿수 가 n이라고 한다면..

입력값은?    N^(n-1)*X(n-1) +  X^(n-2)*X(n-2) + ...... +X^0* X(0) 로 표현할수 있겠죠

위의 경우 
2진법의 경우  =   2^2 * 1 +  2^1 * 0 +   2^0*1  =    4  + 0 + 1 = 5
8진법의 경우  =   8^2 * 1 +  8^1 * 0 +   8^0*1  =   64 + 0 + 1 = 65
10진법의 경우 =  10^2 * 1 + 10^1 * 0 + 10^0*1 = 100 + 0 + 1 = 101
16진법의 경우 =  16^2 * 1 + 16^1 * 0 + 16^0*1 = 256 + 0 + 1 = 257

이렇게 됩니다.

[16진의 경우]
일단 기본원리는 똑같습니다.

문제는 입력을 숫자로 받는것이 아니라 character 로 입력받는다는데 있습니다.
문자 '1' 은 숫자 1 이 아니라  16진으로 보면  0x31이구 10진으로 보면 49라는것입니다.
그러므로 해당 ascii값을 보고 그만큼 뺀후 계산하시면 됩니다.

'0' ~ '9'는  '0x30 ~ 0x39 = 48 ~ 57이므로
해당 char에서 0x30=48을 뺀후 계산하시면 될것이구요

''a' ~ 'f'는  0x61 ~0x66 = 97 ~ 102 이므로 'a'가 10이 나오려면 'a'-87하면되겠죠
그러므로  'a' ~ 'f'는  해당 char에서 87을 빼줘서 계산해야 하구요

'ABCDEF' 는 ascii값이 0x41~ 0x46 = 65 ~ 70 이므로
해당 char에서 55를 뺀후 계산하시면 될것입니다.
'A' - 55 = 0x41 - 55 = 10 이 되니까요

잘 연구해 깔끔한 변환함수 하나 만들어보세요

그럼...




진수변환 님이 쓰신 글 :
: #include <stdio.h>
:
: /* 진법을 변환 하는 함수 */
: void jinbup(unsigned long a,unsigned long b);
:
:
: void main(void)
: {
:     unsigned long  divisor=0; /* 제  수 */
:     unsigned long dividend=0; /* 피제수 */
:     char digit[256]={""}; /* 값을 입력 받는 배열 */
:     int i=0;
:     int k=0; /*10진수 변환 데이터 저장 */
:    
:
:     while(1)
:     {
:         printf("\n몇 진법의 수 입니까?(2 ~ 16) : ");
:         scanf("%lu",&divisor);
:                
:         if (divisor < 2 || divisor > 16)    /* 2,8,10,16 진수 */
:         {
:             printf("\n에러 : 2이상 16이하만 입력하세요...\n");
:         }
:
:         else
:         {
:             printf("2진수={0,1}, 8진수={0~7}, 10진수={0~9}, 16진수={0~9,a~f}\n");
:             printf("수를 입력하세요 : ");
:             scanf("%s",digit);            /*수를 배열로 받습니다. */
:         }
:             break;       
:     }
:
:    
:     switch(divisor) {
:
:     case 2:
:
:         while(digit[i]=='1' || digit[i]=='0') {    /* 2진수 -> 10진수 */
:             k<<=1;
:             k+=(digit[i]-'0');
:             i++;
:         }
:         dividend=k;
:
:         jinbup(8, dividend);
:         jinbup(10, dividend);
:         jinbup(16, dividend);
:         break;
:    
:     case 8:
:
:         while(digit[i]>='0' && digit[i]<='8') {   /* 8진수 - > 10진수 */
:             k<<=3;
:             k+=(digit[i]-'0');
:             i++;
:         }
:         dividend=k;
:
:         jinbup(2, dividend);
:         jinbup(10, dividend);
:         jinbup(16, dividend);
:         break;
:
:     case 10:
:
:         jinbup(2, dividend);
:         jinbup(8, dividend);
:         jinbup(16, dividend);
:         break;
:
:     case 16:
:
:         jinbup(2, dividend);
:         jinbup(8, dividend);
:         jinbup(10, dividend);
:         break;
:    
:     }
: }
:
:
:
: /* 진법 변환 실행 */
: /*    계속 나누면서 나머지만을 모았다가 거꾸로 출력하는 방법   */
:
: void jinbup(unsigned long a,unsigned long b) {
:
:
:     unsigned long  remainder=0; /* 나머지 */
:     int i=0; /* for문에서 사용될 카운터용 변수 */
:     int cipher=0; /* 자리수, for문에서 사용 */
:     char digit[256]={0}; /* 진법의 출력값(역순으로 저장될 곳) */
:
:     for(cipher=0; b>=a; cipher++)
:     {
:          remainder=b%a;
:        b/=a;
:          if (remainder < 10) digit[cipher]=(char)('0'+remainder);
:        else digit[cipher]=(char)('a'+(remainder-10));
:     }
:
:     remainder=b%a;
:    
:     if(remainder<10) digit[cipher++]=(char)('0'+remainder);
:         else digit[cipher++]=(char)('a'+(remainder-10));
:   
:     digit[cipher]='\0';
:
:     printf("\n%lu진법의 수는 ",a);
:
:     /* 저장된 문자열을 거꾸로 출력합니다. */
:
:     for(i=cipher-1;i >= 0;i--) putchar(digit[i]);
:    
:     printf("입니다.\n\n\n");
: }
:
:
: 제가 지금 진수 변환하는 소스를 짜고있는데...
: 16진수->10진수 로 변환하는걸 어떻게해야할지 막막합니다.ㅠㅠ
: case 16: 부분에 넣어줘야할텐데....
: 도움좀 주세요
: 소스도 엉망진창이여서 잘보실수 있으시련지.

+ -

관련 글 리스트
50556 질문이요. 진수변환 1099 2007/09/13
50560     Re:질문이요. 장성호 1440 2007/09/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.