진법 변환

1. 주의점

Warning

진법 변환은 대부분 아래 3개만 알면 된다.

Integer.toString(num, radix);       // 10진수 숫자 -> N진수 문자열
Integer.parseInt(str, radix);       // N진수 문자열 -> 10진수 int
Long.parseLong(str, radix);         // int 범위 초과 시 long
주의설명
radix진법. 보통 2, 3, 8, 10, 16 사용
지원 범위Integer.toString()은 2~36진수까지 가능
결과 타입진법 변환 결과는 보통 String
큰 수int 범위 초과 가능하면 Long 또는 BigInteger
Integer.bitCount()문자열이 아니라 숫자를 넣어야 함
음수의 2진수 변환toBinaryString()은 2의 보수 형태로 나올 수 있음

2. 기본 변환

Info

10진수 숫자를 N진수 문자열로 바꿀 때는 Integer.toString(num, radix)를 사용한다.

int num = 255;
 
String base2 = Integer.toString(num, 2);   // 2진수
String base3 = Integer.toString(num, 3);   // 3진수
String base5 = Integer.toString(num, 5);   // 5진수
String base16 = Integer.toString(num, 16); // 16진수

2진수, 8진수, 16진수는 전용 메서드도 있다.

String binary = Integer.toBinaryString(num); // 2진수
String octal  = Integer.toOctalString(num);  // 8진수
String hex    = Integer.toHexString(num);    // 16진수, 소문자

대문자 16진수가 필요하면 toUpperCase()를 붙인다.

String hexUpper = Integer.toHexString(num).toUpperCase();

3. N진수 문자열을 10진수로 변환

Info

N진수 문자열을 10진수 숫자로 바꿀 때는 Integer.parseInt(str, radix)를 사용한다.
두 번째 인자에는 현재 문자열이 몇 진수인지 넣는다.

String strBin = "1101";
String strHex = "FF";
 
int dec1 = Integer.parseInt(strBin, 2);   // 2진수 "1101" -> 13
int dec2 = Integer.parseInt(strHex, 16);  // 16진수 "FF" -> 255

숫자가 int 범위를 넘을 수 있으면 Long.parseLong()을 사용한다.

long bigDec = Long.parseLong("10000000000", 2);

4. A진수에서 B진수로 변환

Info

A진수를 바로 B진수로 바꾸는 것이 아니라, 보통 10진수를 중간에 거친다.

A진수 문자열 -> 10진수 숫자 -> B진수 문자열

예시: 3진수 "102"를 5진수로 변환

String s3 = "102";
 
int temp = Integer.parseInt(s3, 3);    // 3진수 -> 10진수
String s5 = Integer.toString(temp, 5); // 10진수 -> 5진수

5. bitCount

Info

Integer.bitCount(num)은 숫자를 2진수로 봤을 때 1의 개수를 세는 메서드다.

int count = Integer.bitCount(13); // 13 = 1101(2), 결과 3

입력은 문자열이 아니라 숫자다.

Integer.bitCount(0b1101); // 가능
Integer.bitCount(13);     // 가능
 
// Integer.bitCount("1101"); // 불가능

숫자는 10진수로 쓰든, 2진수 리터럴로 쓰든, 16진수 리터럴로 쓰든 결국 같은 값이면 결과도 같다.

Integer.bitCount(78);     // 10진수
Integer.bitCount(0b1001110); // 2진수
Integer.bitCount(0x4E);   // 16진수

6. BigInteger

Info

long 범위도 넘는 큰 수가 나오면 BigInteger를 사용한다.
코딩테스트에서 입력 길이가 매우 긴 진법 문자열이면 고려한다.

N진수 문자열을 BigInteger로 바꾸기:

BigInteger bigNum = new BigInteger(str, radix);

BigInteger를 N진수 문자열로 바꾸기:

String result = bigNum.toString(radix);

예시:

String hugeBinary = "1111111111111111111111111111111111111111";
 
BigInteger bigNum = new BigInteger(hugeBinary, 2); 
 
String base3 = bigNum.toString(3);
String base16 = bigNum.toString(16);

7. 코딩테스트 기준 선택

Tip

진법 변환 문제는 대부분 Integer 또는 Long으로 해결된다.
입력 숫자가 매우 크다는 조건이 있을 때만 BigInteger를 사용하면 된다.

상황추천
10진수 int N진수Integer.toString(num, radix)
N진수 문자열 intInteger.parseInt(str, radix)
int 범위 초과 가능Long.parseLong(str, radix)
long 범위도 초과BigInteger
2진수에서 1 개수 세기Integer.bitCount(num)
A진수 B진수parseInt()toString()