본문 바로가기
java

진법 변환

by chunkind 2023. 7. 23.
반응형

진법 변환은 컴퓨터 과학에서 중요한 주제입니다. 이 글에서는 10진수를 2진수, 8진수, 16진수로 변환하는 방법과 그 반대의 과정을 설명하고, 각 진법 간의 상호 변환 방법에 대해서도 다루겠습니다.

10진수를 2진수, 8진수, 16진수로 변환하기

정수 부분 변환

10진수의 정수 부분을 다른 진수로 변환하는 방법은 다음과 같습니다:

  1. 변환할 진수로 10진수 값을 나눕니다.
  2. 몫과 나머지를 기록합니다.
  3. 몫이 0이 될 때까지 나누기를 반복합니다.
  4. 나머지를 역순으로 읽습니다.

소수 부분 변환

10진수의 소수 부분을 변환하는 방법은 다음과 같습니다:

  1. 소수 부분에 변환할 진수를 곱합니다.
  2. 결과의 정수 부분을 기록합니다.
  3. 소수 부분이 0이 되거나 반복되는 수가 나올 때까지 위 과정을 반복합니다.

예: 47.625를 2진수, 8진수, 16진수로 변환하기

2진수로 변환

정수 부분:

2 | 47
2 | 23 ... 1
2 | 11 ... 1
2 | 5  ... 1
2 | 2  ... 1
   1  ... 0
=> (47)10 = (101111)2

소수 부분:

0.625 * 2 = 1.25  -> 1
0.25  * 2 = 0.5   -> 0
0.5   * 2 = 1.0   -> 1
=> (0.625)10 = (0.101)2

최종 변환:

(47.625)10 = (101111.101)2

8진수로 변환

정수 부분:

8 | 47
  5 ... 7
=> (47)10 = (57)8

소수 부분:

0.625 * 8 = 5.000
=> (0.625)10 = (0.5)8

최종 변환:

(47.625)10 = (57.5)8

16진수로 변환

정수 부분:

16 | 47
   2 ... 15(F)
=> (47)10 = (2F)16

소수 부분:

0.625 * 16 = 10(A).000
=> (0.625)10 = (0.A)16

최종 변환:

(47.625)10 = (2F.A)16

다른 진법을 10진수로 변환하기

2진수, 8진수, 16진수를 10진수로 변환하는 방법:

  1. 각 자리의 숫자를 해당 진수의 자리 값으로 곱합니다.
  2. 모든 결과를 더합니다.

예: (101111.101)2를 10진수로 변환하기

(1 0 1 1 1 1 . 1 0 1)2
= 2^5 + 2^3 + 2^2 + 2^1 + 2^0 + 2^-1 + 2^-3
= 32 + 8 + 4 + 2 + 1 + 0.5 + 0.125
= 47.625

예: (57.5)8를 10진수로 변환하기

(5 7 . 5)8
= 5 * 8^1 + 7 * 8^0 + 5 * 8^-1
= 40 + 7 + 0.625
= 47.625

예: (2F.A)16을 10진수로 변환하기

(2 F . A)16
= 2 * 16^1 + 15 * 16^0 + 10 * 16^-1
= 32 + 15 + 0.625
= 47.625

진법 간 상호 변환

2진수를 8진수로 변환

정수 부분은 소수점을 기준으로 왼쪽으로 3자리씩, 소수 부분은 오른쪽으로 3자리씩 묶어서 변환합니다.

예: (111001011.10101)2를 8진수로 변환하기

111 001 011 . 101 010
(7 1 3 . 5 2)8
=> (111001011.10101)2 = (713.52)8

2진수를 16진수로 변환

정수 부분은 소수점을 기준으로 왼쪽으로 4자리씩, 소수 부분은 오른쪽으로 4자리씩 묶어서 변환합니다.

예: (11001011.10101)2를 16진수로 변환하기

1100 1011 . 1010 1000
(C B . A 8)16
=> (11001011.10101)2 = (CB.A8)16

8진수를 2진수로 변환

8진수 1자리는 2진수 3자리로 변환합니다.

예: (713.52)8를 2진수로 변환하기

7 -> 111, 1 -> 001, 3 -> 011, . 5 -> 101, 2 -> 010
=> (713.52)8 = (111001011.10101)2

16진수를 2진수로 변환

16진수 1자리는 2진수 4자리로 변환합니다.

예: (1B8.6A8)16를 2진수로 변환하기

1 -> 0001, B -> 1011, 8 -> 1000, . 6 -> 0110, A -> 1010, 8 -> 1000
=> (1B8.6A8)16 = (11011000.01101010)2

8진수와 16진수 간의 변환

8진수를 16진수로 변환하기

8진수를 먼저 2진수로 변환한 뒤 16진수로 변환합니다.

예: (670.325)8을 16진수로 변환하기

  1. 8진수를 2진수로 변환:
6 -> 110, 7 -> 111, 0 -> 000, . 3 -> 011, 2 -> 010, 5 -> 101
=> (670.325)8 = (110111000.011010101)2
  1. 2진수를 16진수로 변환:
1 1011 1000 . 0110 1010 1000
=> (110111000.011010101)2 = (1B8.6A8)16

결론

진법 변환은 숫자를 다양한 형태로 표현하고 계산하는 데 중요한 기술입니다. 이 글에서는 10진수, 2진수, 8진수, 16진수 간의 변환 방법을 다루었으며, 각 진법 간의 상호 변환 방법을 설명했습니다. 이 정보를 통해 다양한 진법 간의 변환을 이해하고 실습할 수 있을 것입니다.

10진수를 2진수, 8진수, 16진수로 변환하는 Java 코드

public class NumberConversion {

    // 10진수를 2진수로 변환
    public static String toBinary(double decimal) {
        int intPart = (int) decimal;
        double fracPart = decimal - intPart;

        String intStr = Integer.toBinaryString(intPart);
        StringBuilder fracStr = new StringBuilder(".");

        while (fracPart != 0) {
            fracPart *= 2;
            if (fracPart >= 1) {
                fracStr.append("1");
                fracPart -= 1;
            } else {
                fracStr.append("0");
            }
            if (fracStr.length() > 32) break; // Precision limit to prevent infinite loop
        }

        return intStr + fracStr.toString();
    }

    // 10진수를 8진수로 변환
    public static String toOctal(double decimal) {
        int intPart = (int) decimal;
        double fracPart = decimal - intPart;

        String intStr = Integer.toOctalString(intPart);
        StringBuilder fracStr = new StringBuilder(".");

        while (fracPart != 0) {
            fracPart *= 8;
            fracStr.append((int)fracPart);
            fracPart -= (int)fracPart;
            if (fracStr.length() > 32) break; // Precision limit to prevent infinite loop
        }

        return intStr + fracStr.toString();
    }

    // 10진수를 16진수로 변환
    public static String toHexadecimal(double decimal) {
        int intPart = (int) decimal;
        double fracPart = decimal - intPart;

        String intStr = Integer.toHexString(intPart).toUpperCase();
        StringBuilder fracStr = new StringBuilder(".");

        while (fracPart != 0) {
            fracPart *= 16;
            int intFraction = (int)fracPart;
            if (intFraction < 10) {
                fracStr.append(intFraction);
            } else {
                fracStr.append((char)('A' + (intFraction - 10)));
            }
            fracPart -= intFraction;
            if (fracStr.length() > 32) break; // Precision limit to prevent infinite loop
        }

        return intStr + fracStr.toString();
    }

    // 2진수를 10진수로 변환
    public static double binaryToDecimal(String binary) {
        String[] parts = binary.split("\\.");
        int intPart = Integer.parseInt(parts[0], 2);
        double fracPart = 0;

        if (parts.length > 1) {
            String fracStr = parts[1];
            for (int i = 0; i < fracStr.length(); i++) {
                if (fracStr.charAt(i) == '1') {
                    fracPart += Math.pow(2, -(i + 1));
                }
            }
        }

        return intPart + fracPart;
    }

    // 8진수를 10진수로 변환
    public static double octalToDecimal(String octal) {
        String[] parts = octal.split("\\.");
        int intPart = Integer.parseInt(parts[0], 8);
        double fracPart = 0;

        if (parts.length > 1) {
            String fracStr = parts[1];
            for (int i = 0; i < fracStr.length(); i++) {
                fracPart += Character.getNumericValue(fracStr.charAt(i)) * Math.pow(8, -(i + 1));
            }
        }

        return intPart + fracPart;
    }

    // 16진수를 10진수로 변환
    public static double hexadecimalToDecimal(String hex) {
        String[] parts = hex.split("\\.");
        int intPart = Integer.parseInt(parts[0], 16);
        double fracPart = 0;

        if (parts.length > 1) {
            String fracStr = parts[1];
            for (int i = 0; i < fracStr.length(); i++) {
                char digit = fracStr.charAt(i);
                int value;
                if (Character.isDigit(digit)) {
                    value = Character.getNumericValue(digit);
                } else {
                    value = 10 + (Character.toUpperCase(digit) - 'A');
                }
                fracPart += value * Math.pow(16, -(i + 1));
            }
        }

        return intPart + fracPart;
    }

    public static void main(String[] args) {
        double decimal = 47.625;

        // 10진수를 2진수, 8진수, 16진수로 변환
        String binary = toBinary(decimal);
        String octal = toOctal(decimal);
        String hex = toHexadecimal(decimal);

        System.out.println("10진수: " + decimal);
        System.out.println("2진수: " + binary);
        System.out.println("8진수: " + octal);
        System.out.println("16진수: " + hex);

        // 2진수, 8진수, 16진수를 10진수로 변환
        double decimalFromBinary = binaryToDecimal(binary);
        double decimalFromOctal = octalToDecimal(octal);
        double decimalFromHex = hexadecimalToDecimal(hex);

        System.out.println("2진수에서 변환한 10진수: " + decimalFromBinary);
        System.out.println("8진수에서 변환한 10진수: " + decimalFromOctal);
        System.out.println("16진수에서 변환한 10진수: " + decimalFromHex);
    }
}

 

코드 설명

  1. toBinary(double decimal): 10진수를 2진수로 변환합니다. 정수 부분은 Integer.toBinaryString() 메서드를 사용하고, 소수 부분은 2를 곱한 후 정수 부분을 추출하여 반복합니다.
  2. toOctal(double decimal): 10진수를 8진수로 변환합니다. 정수 부분은 Integer.toOctalString() 메서드를 사용하고, 소수 부분은 8을 곱한 후 정수 부분을 추출하여 반복합니다.
  3. toHexadecimal(double decimal): 10진수를 16진수로 변환합니다. 정수 부분은 Integer.toHexString() 메서드를 사용하고, 소수 부분은 16을 곱한 후 정수 부분을 추출하여 반복합니다.
  4. binaryToDecimal(String binary): 2진수를 10진수로 변환합니다. 정수 부분은 Integer.parseInt(parts[0], 2)를 사용하고, 소수 부분은 각 자릿수의 값에 2의 음수 제곱을 곱하여 더합니다.
  5. octalToDecimal(String octal): 8진수를 10진수로 변환합니다. 정수 부분은 Integer.parseInt(parts[0], 8)를 사용하고, 소수 부분은 각 자릿수의 값에 8의 음수 제곱을 곱하여 더합니다.
  6. hexadecimalToDecimal(String hex): 16진수를 10진수로 변환합니다. 정수 부분은 Integer.parseInt(parts[0], 16)를 사용하고, 소수 부분은 각 자릿수의 값에 16의 음수 제곱을 곱하여 더합니다.

위 코드를 사용하면 10진수와 2진수, 8진수, 16진수 간의 변환을 손쉽게 수행할 수 있습니다. 각 변환 방법을 이해하고 직접 구현해보면서 숫자 시스템에 대한 이해를 높일 수 있습니다.

반응형