ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바] 기수 변환 (e.g. 10진수 ↔ 2진수 변환)
    Algorithms 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

     

    반응형

    댓글

Designed by Tistory.