진법이란?
진법은 숫자를 표현하는 체계로, 특정 숫자를 구성하는 각 자릿수의 가치를 나타내는 방법입니다. 우리가 일상적으로 사용하는 10진법은 0부터 9까지의 숫자를 사용하며, 각 자리의 위치에 따라 값이 10의 제곱으로 증가합니다.
예를 들어, 숫자 2901을 생각해보면:
- 1000의 자리: 2 × 1000 = 2000
- 100의 자리: 9 × 100 = 900
- 10의 자리: 0 × 10 = 0
- 1의 자리: 1 × 1 = 1
이들을 모두 더하면 2901이 됩니다. 다른 진법도 비슷한 방식으로 숫자의 값을 계산합니다.
10진법 -> 2진법 변환
2진법은 0과 1 두 개의 숫자만을 사용합니다. 10진수를 2진수로 변환하는 방법은 매우 간단합니다: 주어진 수를 2로 나누고 나머지를 기록한 다음, 이 나머지를 역순으로 읽으면 됩니다.
public class Main {
public static void main(String[] args){
// 10진수 (예: 11)
int number = 11;
// 2진수로 변환
// 수가 0이 될 때까지 2로 나누고, 나머지를 저장한 후 0이 되었을 때 역순으로 읽는다.
StringBuilder sb = new StringBuilder();
while (number > 0) {
sb.append(number % 2); // 2로 나눈 나머지 저장
number /= 2; // 몫을 다시 number로 설정
}
System.out.println(sb.reverse()); // 역순으로 출력
}
}
실행 결과:
11을 2진수로 변환하면 1011이 됩니다.
10진법 -> 3진법 변환
3진법에서는 0, 1, 2 세 가지 숫자를 사용합니다. 10진수를 3진수로 변환하는 방법은 2진법과 비슷합니다. 주어진 수를 3으로 나누고 나머지를 기록한 후, 이 나머지를 역순으로 읽습니다.
public class Main {
public static void main(String[] args){
// 10진수 (예: 11)
int number = 11;
// 3진수로 변환
// 수가 0이 될 때까지 3으로 나누고, 나머지를 저장한 후 0이 되었을 때 역순으로 읽는다.
StringBuilder sb = new StringBuilder();
while (number > 0) {
sb.append(number % 3); // 3으로 나눈 나머지 저장
number /= 3; // 몫을 다시 number로 설정
}
System.out.println(sb.reverse()); // 역순으로 출력
}
}
실행 결과:
11을 3진수로 변환하면 102가 됩니다.
10진법 -> N진법 변환
10 이상의 숫자를 A, B, C 등의 알파벳으로 표현해야 합니다.
아래 코드는 10진수를 임의의 N진법으로 변환하는 방법을 보여줍니다.
public class Main {
public static void main(String[] args) {
// 10진수 (예: 925)
int number = 925;
// 변환할 진법 (예: 16진법)
int base = 16;
System.out.println(convertToBase(base, number)); // 올바른 출력: 39D
}
// base: 진법, number: 10진수
public static String convertToBase(int base, int number) {
StringBuilder sb = new StringBuilder();
// 10~15를 표현하기 위한 문자들
String hexDigits = "ABCDEF";
// 10진수인 경우 그대로 반환
if (base == 10) {
return String.valueOf(number);
}
// N진법으로 변환
while (number > 0) {
int remainder = number % base;
// 10 이상이면 알파벳으로 변환
if (remainder >= 10) {
sb.append(hexDigits.charAt(remainder - 10));
} else {
sb.append(remainder);
}
number /= base; // 몫을 다시 number로 설정
}
// 결과 문자열을 역순으로 반환
return sb.reverse().toString();
}
}
실행 결과:
925를 16진수로 변환하면 39D가 됩니다.
2진법 -> 10진법 변환
이제 2진수를 10진수로 변환하는 방법을 살펴보겠습니다. 각 자릿수를 읽어가면서, 해당 자릿수의 가중치(2의 제곱)를 곱하여 더해주면 됩니다.
public class Main {
public static void main(String[] args){
// 2진수 문자열 (예: "1011")
String binaryNumber = "1011";
int decimalResult = 0;
int baseMultiplier = 1; // 각 자릿수에 해당하는 가중치 (2의 제곱수)
// 2진수 문자열을 뒤에서부터 읽으며 10진수로 변환
for (int i = binaryNumber.length() - 1; i >= 0; i--) {
decimalResult += (binaryNumber.charAt(i) - '0') * baseMultiplier;
baseMultiplier *= 2; // 다음 자리의 가중치는 2배
}
System.out.println(decimalResult); // 출력: 11
}
}
실행 결과:
1011을 10진수로 변환하면 11이 됩니다.
N진법 -> 10진법 변환
N진수를 10진수로 변환할 때도 2진법과 동일한 원리를 적용할 수 있습니다. 각 자릿수를 읽어가며 해당 진법의 제곱수를 곱하고, 모든 값을 더해줍니다.
public class Main {
public static void main(String[] args){
// N진수 문자열 (예: "39D")
String baseNumber = "39D";
int base = 16;
int decimalResult = 0;
int baseMultiplier = 1; // 각 자릿수에 해당하는 가중치 (base의 제곱수)
// N진수 문자열을 뒤에서부터 읽으며 10진수로 변환
for (int i = baseNumber.length() - 1; i >= 0; i--) {
char c = baseNumber.charAt(i);
// A~F 문자 처리
if (c >= 'A' && c <= 'F') {
decimalResult += (c - 'A' + 10) * baseMultiplier;
} else {
decimalResult += (c - '0') * baseMultiplier;
}
baseMultiplier *= base; // 다음 자리의 가중치는 base배
}
System.out.println(decimalResult); // 출력: 925
}
}
실행 결과:
39D를 10진수로 변환하면 925가 됩니다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 자릿수 더하기 (Java 예제) (1) | 2024.09.26 |
---|---|
[알고리즘] 비트 연산자 정리 (Java 예제 포함) (0) | 2024.08.23 |
[알고리즘] 동적계획법(Dynamic Programming : DP) (0) | 2024.08.20 |
[알고리즘] 소인수분해 (Java) (0) | 2024.08.17 |
[알고리즘] 효율적으로 소수를 구하는 방법 (Java 예제 포함) (0) | 2024.08.16 |