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);
}
}
코드 설명
- toBinary(double decimal): 10진수를 2진수로 변환합니다. 정수 부분은 Integer.toBinaryString() 메서드를 사용하고, 소수 부분은 2를 곱한 후 정수 부분을 추출하여 반복합니다.
- toOctal(double decimal): 10진수를 8진수로 변환합니다. 정수 부분은 Integer.toOctalString() 메서드를 사용하고, 소수 부분은 8을 곱한 후 정수 부분을 추출하여 반복합니다.
- toHexadecimal(double decimal): 10진수를 16진수로 변환합니다. 정수 부분은 Integer.toHexString() 메서드를 사용하고, 소수 부분은 16을 곱한 후 정수 부분을 추출하여 반복합니다.
- binaryToDecimal(String binary): 2진수를 10진수로 변환합니다. 정수 부분은 Integer.parseInt(parts[0], 2)를 사용하고, 소수 부분은 각 자릿수의 값에 2의 음수 제곱을 곱하여 더합니다.
- octalToDecimal(String octal): 8진수를 10진수로 변환합니다. 정수 부분은 Integer.parseInt(parts[0], 8)를 사용하고, 소수 부분은 각 자릿수의 값에 8의 음수 제곱을 곱하여 더합니다.
- hexadecimalToDecimal(String hex): 16진수를 10진수로 변환합니다. 정수 부분은 Integer.parseInt(parts[0], 16)를 사용하고, 소수 부분은 각 자릿수의 값에 16의 음수 제곱을 곱하여 더합니다.
위 코드를 사용하면 10진수와 2진수, 8진수, 16진수 간의 변환을 손쉽게 수행할 수 있습니다. 각 변환 방법을 이해하고 직접 구현해보면서 숫자 시스템에 대한 이해를 높일 수 있습니다.
반응형