진법 변환은 컴퓨터 과학에서 중요한 주제입니다. 이 글에서는 10진수를 2진수, 8진수, 16진수로 변환하는 방법과 그 반대의 과정을 설명하고, 각 진법 간의 상호 변환 방법에 대해서도 다루겠습니다.
10진수를 2진수, 8진수, 16진수로 변환하기
정수 부분 변환
10진수의 정수 부분을 다른 진수로 변환하는 방법은 다음과 같습니다:
- 변환할 진수로 10진수 값을 나눕니다.
- 몫과 나머지를 기록합니다.
- 몫이 0이 될 때까지 나누기를 반복합니다.
- 나머지를 역순으로 읽습니다.
소수 부분 변환
10진수의 소수 부분을 변환하는 방법은 다음과 같습니다:
- 소수 부분에 변환할 진수를 곱합니다.
- 결과의 정수 부분을 기록합니다.
- 소수 부분이 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진수로 변환하는 방법:
- 각 자리의 숫자를 해당 진수의 자리 값으로 곱합니다.
- 모든 결과를 더합니다.
예: (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진수로 변환하기
- 8진수를 2진수로 변환:
6 -> 110, 7 -> 111, 0 -> 000, . 3 -> 011, 2 -> 010, 5 -> 101
=> (670.325)8 = (110111000.011010101)2
- 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);
}
}
코드 설명
- 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진수 간의 변환을 손쉽게 수행할 수 있습니다. 각 변환 방법을 이해하고 직접 구현해보면서 숫자 시스템에 대한 이해를 높일 수 있습니다.