Algorithms

[자바] 기수 변환 (e.g. 10진수 ↔ 2진수 변환)

자굿 2022. 2. 1. 12:27

TL;DR


1. 10진수 정수 -> n 진수 문자열

int num = 123;

String num2Str = Integer.toString(num, 2); //2진수
String num3Str = Integer.toString(num, 3); //3진수
String num8Str = Integer.toString(num, 8); //8진수
String num16Str = Integer.toString(num, 16); //16진수

System.out.println(num2Str); //1111011
System.out.println(num3Str); //11120
System.out.println(num8Str); //173
System.out.println(num16Str); //7b

16진수 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

2. n 진수 문자열 -> 10진수 정수

String num2Str = "1111011";
String num3Str = "11120";
String num8Str = "173";
String num16Str = "7b";

int num2 = Integer.parseInt(num2Str, 2); //2진수 문자열
int num3 = Integer.parseInt(num3Str, 3); //3진수 문자열
int num8 = Integer.parseInt(num8Str, 8); //8진수 문자열
int num16 = Integer.parseInt(num16Str, 16); //16진수 문자열

System.out.println(num2); //123
System.out.println(num3); //123
System.out.println(num8); //123
System.out.println(num16); //123

서론


알고리즘 문제를 풀다 보면 가끔 기수 변환을 하는 문제가 나온다.

단순 기수 변환만 하는 문제도 나오지만

대부분은 중간 과정에서 10진수를 n 진수 또는 n 진수를 10진수로 전처리하는 경우가 많다.

정수값을 임의의 기수로 변환하는 방법에 대해서 정리해보려 한다.


목차


1. 10진수 정수 -> n 진수 문자열

2. n 진수 문자열 -> 10진수 정수


1. 10 진수 정수 -> n 진수 문자열


10진수를 n 진수로 변환하려면

정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈을 반복해야 한다.

이 과정을 몫이 0이 될 때까지 반복하고 구한 나머지를 역순으로 정렬하면 n 진수로 변환된 숫자가 나온다.

아래 코드는 123을 2진수 문자열로 변환하는 예시 코드이다.

 

기본적인 방법

 

int n = 2; //2진수 예시
int num10 = 123; //10진수
String numNStr = ""; //n진수 문자열

while(num10 > 0){
    numNStr = String.valueOf(num10 % n) + numNStr;
    num10 /= n;
}

System.out.println(numNStr); //2진수 1111011


16진수의 경우 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F로 이루어지기 때문에 기본적인 방법으로 계산 시

711이 나오며 11은 B이므로 7B로 변환하여야 한다.

 

Java Integer 라이브러리 사용


Java Integer 라이브러리에서 기수 변환 기능을 제공한다.

아래 코드는 숫자를 Integer.toString( 10진수 정수, n진수 ) 함수를 사용하여

기수 변환하는 예시 코드이다.

 

int num = 123;

String num2Str = Integer.toString(num, 2); //2진수
String num3Str = Integer.toString(num, 3); //3진수
String num8Str = Integer.toString(num, 8); //8진수
String num16Str = Integer.toString(num, 16); //16진수

System.out.println(num2Str); //1111011
System.out.println(num3Str); //11120
System.out.println(num8Str); //173
System.out.println(num16Str); //7b

 


2. n 진수 문자열 -> 10진수 정수


n 진수를 10 진수로 변환하려면

10진수를 n 진수로 변환하였던 역순으로 진행하면 된다. (조립은 분해의 역순 😊)

n 진수를 역순으로 n의 0승(자릿수 - 1)부터 곱하여 더해준다.

이 과정을 n 진수의 자릿수만큼 반복하면 10 진수를 구할 수 있다.

아래 코드는 "1111011" 2진수 문자열을 10 진수 정수로 변환하는 예시 코드이다.

 

기본적인 방법

 

  • 곱셈 풀이

 

String numNStr = "1111011"; //2진수 문자열

int n = 2; //2진수
int len = numNStr.length();
String[] strArr = numNStr.split("");

int num10 = 0;
int multi = 1;

for(int i=len-1; i>=0; i--){
    num10 += Integer.valueOf(strArr[i]) * multi;
    multi *= n;
}

System.out.println(num10); //123

 

  • Math.pow() 사용하여 제곱 풀이

 

String numNStr = "1111011"; //2진수 문자열

int n = 2; //2진수
int len = numNStr.length();
String[] strArr = numNStr.split("");

int num10 = 0;
int index = 0;

for(int i=len-1; i>=0; i--){
    num10 += Integer.valueOf(strArr[i]) * (int)Math.pow(n, index);
    index++;
}

System.out.println(num10); //123

 

Java Integer 라이브러리 사용


Java Integer 라이브러리에서 기수 변환 기능을 제공한다.

아래 코드는 숫자 형태의 문자열을 Integer.parseInt( n진수 형태 문자열, n진수 ) 함수를 사용하여

기수 변환하는 예시 코드이다.

 

String num2Str = "1111011";
String num3Str = "11120";
String num8Str = "173";
String num16Str = "7b";

int num2 = Integer.parseInt(num2Str, 2); //2진수 문자열
int num3 = Integer.parseInt(num3Str, 3); //3진수 문자열
int num8 = Integer.parseInt(num8Str, 8); //8진수 문자열
int num16 = Integer.parseInt(num16Str, 16); //16진수 문자열

System.out.println(num2); //123
System.out.println(num3); //123
System.out.println(num8); //123
System.out.println(num16); //123

 

반응형