진법 변환

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()