|
[기본개념]
입력을 받으면 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: 부분에 넣어줘야할텐데....
: 도움좀 주세요
: 소스도 엉망진창이여서 잘보실수 있으시련지.
|