만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/JAVA

[JAVA] 10진수 n진수 변환 (n진법 변환)

D36choi 2022. 5. 7. 20:02
728x90

 

 

알고리즘 문제에서 자주 사용되는, 10진수 -> n진수 변환 방법에 대해 알아보자.

 

Integer.toString 과 toBinaryString 메서드

 

2진수로 변환

final String binNum = Integer.toBinaryString(16);
System.out.println("binNum = " + binNum);

final String formattedNumber = String.format("%8s", binNum).replace(" ", "0");
System.out.println("formattedNumber = " + formattedNumber);

2진수는 toBinaryString(int number); 메서드를 사용하면 문자열로 변환해 보여준다.

만약, 앞에 0을 원하는만큼 붙여주고 싶다면 String.format을 활용 가능하다.

 

n진수로 변환

 

동적으로 2진법, 8진법을 가리지 않고 적용시키고 싶다면 toString(int i, int radix); 메서드를 활용하면 된다.

아래 코드를 통해 3진수, 12진수까지 100 이란 정수를 변환해보았다.

for (int radix = 3; radix < 12; radix++) {
    final String s = Integer.toString(100, radix);
    System.out.println("radix " + radix + " = " + s);
}

 

직접 계산

public String radix(int num, int n) {
        StringBuilder sb = new StringBuilder();
        
        // 숫자가 0이면 0을 리턴
        if (num == 0) return "0";
        
        while (num > 0) {
            // 나머지가 1자릿수면 그대로 추가
            if (num % n < 10) {
                sb.append(num % n);
                
            // 10, 11, 12 .. 의 경우 알파벳을 추가해야함. 10=A, 11=B ...
            } else {
                sb.append((char)(num%n-10 + 'A'));
            }
            // 추가가 끝났다면 n으로 나눈 몫을 다시 계산
            num /= n;
        }
        
        // 계산한 나머지값의 역순으로 만들어야한다.
        return sb.reverse().toString();
    }

설명은 주석으로 대체한다.

 

위 함수로 100을 여러 진법으로 계산해도 위 Integer.toString() 과 동일한 결과가 나온다.

 

n진수 문자열을 10진수 정수로 변환

어려울 것 없이, Integer.parseInt(int i, int radix); 를 이용하면 된다.

숫자 문자열을 2번째 파라미터의 정수문자열 값으로 n진수 변환한다.

아래는 11을 8진수로 변환할 때 10진수 정수 9가 나오는 모습이다.

final int StringToInteger = Integer.parseInt("11", 8);
System.out.println("StringToInteger = " + StringToInteger);