수 체계 간 변환 방법

C++Beginner
지금 연습하기

소개

이 포괄적인 튜토리얼은 C++ 을 사용한 수 체계 변환을 탐구하며, 개발자들이 다양한 수 표현 방식을 처리하는 데 필요한 필수적인 기술을 제공합니다. 변환 방법을 이해하고 실용적인 기술을 구현함으로써 프로그래머는 정확하고 효율적으로 다양한 수 체계 간의 숫자를 조작하고 변환할 수 있습니다.

수 체계 기초

수 체계 소개

수 체계는 서로 다른 기수를 사용하여 수치 값을 표현하는 기본적인 방법입니다. 컴퓨터 과학 및 프로그래밍에서 다양한 수 체계를 이해하는 것은 효율적인 데이터 조작 및 표현에 필수적입니다.

일반적인 수 체계

수 체계 기수 사용하는 숫자 예시
십진수 10 0-9 42
이진수 2 0-1 101010
팔진수 8 0-7 52
십육진수 16 0-9, A-F 2A

십진수 체계 (기수 10)

십진수 체계는 일상생활에서 가장 일반적으로 사용되는 수 체계입니다. 숫자를 표현하는 데 10 개의 숫자 (0-9) 를 사용합니다. 각 숫자의 위치는 10 의 거듭제곱을 나타냅니다.

예:

숫자: 3742
= 3 * 10³ + 7 * 10² + 4 * 10¹ + 2 * 10⁰
= 3000 + 700 + 40 + 2
= 3742

이진수 체계 (기수 2)

이진수는 디지털 컴퓨팅의 기초입니다. 0 과 1 의 두 개의 숫자만 사용합니다.

graph TD A[십진수] --> B[이진수 변환] B --> C{2로 반복적으로 나누기} C --> D[나머지를 위에서 아래로 읽기]

십진수에서 이진수로 변환하는 예:

십진수 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

십육진수 체계 (기수 16)

십육진수는 이진 데이터를 더욱 간결하게 표현할 수 있기 때문에 컴퓨팅 분야에서 널리 사용됩니다.

주요 특징:

  • 숫자 0-9 와 문자 A-F 를 사용합니다.
  • 각 십육진수는 4 개의 이진수를 나타냅니다.
  • 메모리 주소, 색상 코드 등에 일반적으로 사용됩니다.

프로그래밍에서의 중요성

수 체계를 이해하는 것은 다음과 같은 작업에 필수적입니다.

  • 저수준 메모리 조작
  • 비트 연산
  • 색상 표현
  • 네트워크 주소 지정
  • 암호화 및 인코딩

실제 고려 사항

C++ 에서 서로 다른 수 체계를 사용할 때 개발자는 다음 사항을 인지해야 합니다.

  • 변환 방법
  • 표현 기법
  • 시스템별 제한 사항
  • 성능 영향

참고: LabEx 는 프로그래밍에서 수 체계 변환을 연습하고 실제 응용을 이해하는 데 훌륭한 자료를 제공합니다.

변환 방법

수 체계 변환 기법 개요

수 체계 변환은 프로그래밍에서 필수적인 기술로, 서로 다른 기수 간의 숫자를 체계적이고 정확하게 변환하는 것을 포함합니다.

변환 전략

1. 십진수에서 다른 기수로 변환

graph TD A[십진수] --> B[반복적인 나눗셈 방법] B --> C[나머지 수집] C --> D[나머지 역순]
십진수에서 이진수로 변환
  • 십진수를 2 로 반복적으로 나눕니다.
  • 아래에서 위로 나머지를 수집합니다.
  • 나머지는 이진수 표현을 구성합니다.

예:

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;
}

2. 이진수에서 십진수로 변환

위치 이진수 자릿수 가중치 기여도
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;
}

3. 십육진수 변환 방법

십진수에서 십육진수로
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)

최선의 방법

  1. 가능한 경우 내장 언어 함수를 사용합니다.
  2. 예외적인 경우 (0, 음수) 를 처리합니다.
  3. 변환 전에 입력을 검증합니다.
  4. 정밀도 요구 사항을 고려합니다.

참고: LabEx 는 강력한 프로그래밍 기초를 구축하기 위해 이러한 변환 방법을 연습할 것을 권장합니다.

C++ 구현

표준 라이브러리 변환 방법

1. 표준 변환 함수 사용

#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)

오류 처리 전략

graph TD A[입력 검증] --> B{유효한 입력?} B -->|예| C[변환 수행] B -->|아니오| D[예외 발생] C --> E[변환된 값 반환] D --> F[오류 처리]

최선의 방법

  1. 가능한 경우 내장 타입 변환 메서드를 사용합니다.
  2. 강력한 오류 처리를 구현합니다.
  3. 큰 숫자 변환에 대한 성능을 고려합니다.
  4. 변환 전에 입력을 검증합니다.

컴파일 및 실행

Ubuntu 22.04 에서 컴파일하려면:

g++ -std=c++11 number_converter.cpp -o number_converter
./number_converter

참고: LabEx 는 C++ 에서 수 체계 변환을 마스터하기 위해 이러한 구현 기법을 연습할 것을 권장합니다.

요약

이 튜토리얼을 통해 C++ 에서 수 체계 변환의 기본적인 기술을 보여주었습니다. 필수적인 변환 방법, 구현 전략, 그리고 실제 코드 예제를 다루었습니다. 이러한 기술을 숙달함으로써 개발자들은 프로그래밍 기술을 향상시키고, 더 유연하고 견고한 수치 조작 솔루션을 만들 수 있습니다.