진법 변환
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또는BigIntegerInteger.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진수 문자열 → int Integer.parseInt(str, radix)int 범위 초과 가능 Long.parseLong(str, radix)long 범위도 초과 BigInteger2진수에서 1 개수 세기 Integer.bitCount(num)A진수 → B진수 parseInt()후toString()