Java스터디/문제풀이

Java 진법 변환 코드

chunkind 2023. 7. 23. 10:31

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진수 간의 변환을 손쉽게 수행할 수 있습니다. 각 변환 방법을 이해하고 직접 구현해보면서 숫자 시스템에 대한 이해를 높일 수 있습니다.

반응형