알고리즘/자료구조와 알고리즘

[Algorithm][Java] 기수로 변환하기

정석이 2021. 8. 18. 16:22

 

 

정숫값을 기수로 변환하는 알고리즘을 살펴보자.

 

 

 

 

기수 = 수를 나타내는 데 기초가 되는 수로 10진수, 2진수, 8진수, 16진수가 있다.

 

 

 


 

 

 

 

10진수

 

 

  10진수는 아래 10종류의 숫자를 사용해 수를 나타낸다.

 

 

0 1 2 3 4 5 6 7 8 9

 

 

 

 

 

 

  10진수의 각 자리는 아랫자리부터 100,10¹, 10², ...으로 10의 거듭제곱 값을 갖는다.

 

 

 

1234 = 1 x 10³ + 2 x 10² + 3 x 10¹ + 4 x 100

 

 

와 같이 풀어쓸 수 있다.

 

 

 

 

 

 

 

 

8진수

 

 

8진수는 아래 9종류의 숫자를 사용하여 수를 나타낸다.

 

 

 

0 1 2 3 4 5 6 7

 

 

 

 

 

 

8진수의 각 자리는 아랫자리부터 80, 8¹, 8², ...으로 8의 거듭제곱 값을 갖는다.

 

 

 

5306 = 5 x 8³ + 3 x 8² + 0 x 8¹ + 0 x 80

 

 

 

와 같이 풀어쓸 수 있다.

 

 

 

 

 

 

16진수

 

 

16진수는 아래 16종류의 문자를 사용하여 수를 나타낸다.

 

 

 

0 1 2 3 4 5 6 7 8 9 A B C D E F

 

 

 

0~F는 10진수 10~15에 해당한다.

 

 

 

 

 

 

 

16진수 또한 아랫자리부터 순서대로 160, 16¹, 16² ... 으로 16의 거듭제곱 값을 갖는다.

 

 

 

 

12A0 = 1 x 16³ + 2 x 16² + 10 x 16¹ + 0 x 160

 

 

 

 

처럼 풀어쓸 수 있다.

 

 

 

 

 

 

 

 


 

 

 

기수 변환을 수행하는 프로그램 살펴보기

 

 

 

import java.util.Scanner;

class CardConvRev {

   static int cardConvR(int x, int r, char[] d) {
     //정숫값 x를 r진수로 변환하여 배열 d에 아랫자리부터 넣어두고 자릿수를 반환
     
     int digits = 0;
     String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
     do{
         d[digits++] = dchar.charAr(x % r);  // r로 나눈 나머지 저장
         x /= r;
     } while (x != 0);
     
     return digits;
}

 

 

 

 

 

 

 

 

문자열 dchar는 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"로 초기화되어 있으므로 각 문자는 아래와 같이 접근할 수 있다.

 

 

 

 

문자열 접근

 

 

 

 

 

 

 

 

이런 느낌

 

 

 

 

 

 

메서드 맨 앞에서 0으로 초기화하는 digits변환한 수의 자릿수를 나타내기 위한 변수이다.

 

 

 

 

 

do문 루프 본문에서 수행되는 작업

 

 

 

 1  x를 r로 나눈 나머지를 인덱스로 하는 문자를 배열 d의 요소 d[digits]에 대입하고 digits 값을 증가시킨다.

 2  x를 r로 나눈다.

 

 

 

 

 

 

 

 

 

예시

 

 

59를 16진수로 나타내는 예시

 

 

 

 

 

나머지를 구하는 순서대로 배열 d에 저장하므로 배열의 맨 앞인 d[0]이 가장 마지막 자리가 된다.

 

 

 

따라서 위 예시의 답은 0x3B가 된다.