소개
이 포괄적인 튜토리얼은 C++ 을 사용한 수 체계 변환을 탐구하며, 개발자들이 다양한 수 표현 방식을 처리하는 데 필요한 필수적인 기술을 제공합니다. 변환 방법을 이해하고 실용적인 기술을 구현함으로써 프로그래머는 정확하고 효율적으로 다양한 수 체계 간의 숫자를 조작하고 변환할 수 있습니다.
이 포괄적인 튜토리얼은 C++ 을 사용한 수 체계 변환을 탐구하며, 개발자들이 다양한 수 표현 방식을 처리하는 데 필요한 필수적인 기술을 제공합니다. 변환 방법을 이해하고 실용적인 기술을 구현함으로써 프로그래머는 정확하고 효율적으로 다양한 수 체계 간의 숫자를 조작하고 변환할 수 있습니다.
수 체계는 서로 다른 기수를 사용하여 수치 값을 표현하는 기본적인 방법입니다. 컴퓨터 과학 및 프로그래밍에서 다양한 수 체계를 이해하는 것은 효율적인 데이터 조작 및 표현에 필수적입니다.
| 수 체계 | 기수 | 사용하는 숫자 | 예시 |
|---|---|---|---|
| 십진수 | 10 | 0-9 | 42 |
| 이진수 | 2 | 0-1 | 101010 |
| 팔진수 | 8 | 0-7 | 52 |
| 십육진수 | 16 | 0-9, A-F | 2A |
십진수 체계는 일상생활에서 가장 일반적으로 사용되는 수 체계입니다. 숫자를 표현하는 데 10 개의 숫자 (0-9) 를 사용합니다. 각 숫자의 위치는 10 의 거듭제곱을 나타냅니다.
예:
숫자: 3742
= 3 * 10³ + 7 * 10² + 4 * 10¹ + 2 * 10⁰
= 3000 + 700 + 40 + 2
= 3742
이진수는 디지털 컴퓨팅의 기초입니다. 0 과 1 의 두 개의 숫자만 사용합니다.
십진수에서 이진수로 변환하는 예:
십진수 42를 이진수로:
42 ÷ 2 = 21 나머지 0
21 ÷ 2 = 10 나머지 1
10 ÷ 2 = 5 나머지 0
5 ÷ 2 = 2 나머지 1
2 ÷ 2 = 1 나머지 0
1 ÷ 2 = 0 나머지 1
이진수: 101010
십육진수는 이진 데이터를 더욱 간결하게 표현할 수 있기 때문에 컴퓨팅 분야에서 널리 사용됩니다.
주요 특징:
수 체계를 이해하는 것은 다음과 같은 작업에 필수적입니다.
C++ 에서 서로 다른 수 체계를 사용할 때 개발자는 다음 사항을 인지해야 합니다.
참고: LabEx 는 프로그래밍에서 수 체계 변환을 연습하고 실제 응용을 이해하는 데 훌륭한 자료를 제공합니다.
수 체계 변환은 프로그래밍에서 필수적인 기술로, 서로 다른 기수 간의 숫자를 체계적이고 정확하게 변환하는 것을 포함합니다.
예:
int decimalToBinary(int decimal) {
int binary = 0, remainder, factor = 1;
while (decimal > 0) {
remainder = decimal % 2;
binary += remainder * factor;
decimal /= 2;
factor *= 10;
}
return binary;
}
| 위치 | 이진수 자릿수 | 가중치 | 기여도 |
|---|---|---|---|
| 0 | 1 | 2^0 | 1 |
| 1 | 0 | 2^1 | 0 |
| 2 | 1 | 2^2 | 4 |
예:
int binaryToDecimal(long long binary) {
int decimal = 0, base = 1;
while (binary > 0) {
int lastDigit = binary % 10;
binary /= 10;
decimal += lastDigit * base;
base *= 2;
}
return decimal;
}
string decimalToHex(int decimal) {
string hexChars = "0123456789ABCDEF";
string hexResult;
while (decimal > 0) {
hexResult = hexChars[decimal % 16] + hexResult;
decimal /= 16;
}
return hexResult.empty() ? "0" : hexResult;
}
int hexToDecimal(string hex) {
int decimal = 0, power = 0;
for (int i = hex.length() - 1; i >= 0; i--) {
char c = toupper(hex[i]);
int value = (c >= '0' && c <= '9') ?
(c - '0') : (c - 'A' + 10);
decimal += value * pow(16, power++);
}
return decimal;
}
| 변환 유형 | 시간 복잡도 | 공간 복잡도 |
|---|---|---|
| 십진수 → 이진수 | O(log n) | O(1) |
| 이진수 → 십진수 | O(log n) | O(1) |
| 십진수 → 십육진수 | O(log n) | O(1) |
참고: LabEx 는 강력한 프로그래밍 기초를 구축하기 위해 이러한 변환 방법을 연습할 것을 권장합니다.
#include <iostream>
#include <string>
#include <bitset>
class NumberConverter {
public:
// 십진수를 이진수로 변환
static std::string decimalToBinary(int decimal) {
return std::bitset<32>(decimal).to_string();
}
// 이진수를 십진수로 변환
static int binaryToDecimal(const std::string& binary) {
return std::stoi(binary, nullptr, 2);
}
// 십육진수 변환
static int hexToDecimal(const std::string& hex) {
return std::stoi(hex, nullptr, 16);
}
static std::string decimalToHex(int decimal) {
char buffer[20];
sprintf(buffer, "%X", decimal);
return std::string(buffer);
}
};
class AdvancedNumberConverter {
private:
// 자릿수를 값으로 변환하는 유틸리티 메서드
static int charToValue(char c) {
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
throw std::invalid_argument("잘못된 자릿수");
}
public:
// 일반적인 기수 변환 메서드
static int toDecimal(const std::string& number, int base) {
int decimal = 0;
int power = 0;
for (int i = number.length() - 1; i >= 0; --i) {
decimal += charToValue(number[i]) * std::pow(base, power++);
}
return decimal;
}
// 십진수를 임의의 기수로 변환
static std::string fromDecimal(int decimal, int base) {
if (decimal == 0) return "0";
const std::string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::string result;
while (decimal > 0) {
result = digits[decimal % base] + result;
decimal /= base;
}
return result;
}
};
int main() {
// 변환 예시
try {
// 표준 변환
std::cout << "십진수를 이진수로 변환: "
<< NumberConverter::decimalToBinary(42) << std::endl;
// 고급 변환
std::cout << "이진수를 십진수로 변환: "
<< AdvancedNumberConverter::toDecimal("101010", 2) << std::endl;
// 십육진수 변환
std::cout << "십육진수를 십진수로 변환: "
<< AdvancedNumberConverter::toDecimal("2A", 16) << std::endl;
// 십진수를 다른 기수로 변환
std::cout << "십진수 42 를 3 진수로 변환: "
<< AdvancedNumberConverter::fromDecimal(42, 3) << std::endl;
}
catch (const std::exception& e) {
std::cerr << "변환 오류: " << e.what() << std::endl;
}
return 0;
}
| 변환 유형 | 시간 복잡도 | 공간 복잡도 |
|---|---|---|
| 십진수 → 기수 | O(log n) | O(log n) |
| 기수 → 십진수 | O(k) | O(1) |
Ubuntu 22.04 에서 컴파일하려면:
g++ -std=c++11 number_converter.cpp -o number_converter
./number_converter
참고: LabEx 는 C++ 에서 수 체계 변환을 마스터하기 위해 이러한 구현 기법을 연습할 것을 권장합니다.
이 튜토리얼을 통해 C++ 에서 수 체계 변환의 기본적인 기술을 보여주었습니다. 필수적인 변환 방법, 구현 전략, 그리고 실제 코드 예제를 다루었습니다. 이러한 기술을 숙달함으로써 개발자들은 프로그래밍 기술을 향상시키고, 더 유연하고 견고한 수치 조작 솔루션을 만들 수 있습니다.