在 C++ 中,进制转换是一个常见的需求,通常涉及将数字从一种进制(如十进制)转换为另一种进制(如二进制、八进制、十六进制)。以下是常用的进制转换模板和示例:


1. 将十进制转换为其他进制

1.1 使用 std::bitset 转换为二进制

std::bitset 可以方便地将整数转换为二进制字符串。

#include <iostream>
#include <bitset>

int main() {
    int num = 42;

    // 将十进制转换为二进制(8位)
    std::bitset<8> binary(num);
    std::cout << "Binary: " << binary << std::endl; // 00101010

    return 0;
}

1.2 使用 std::ostringstream 转换为任意进制

通过 std::ostringstreamstd::setbase 可以将整数转换为任意进制(2、8、10、16)。

#include <iostream>
#include <sstream>
#include <iomanip> // std::setbase

int main() {
    int num = 42;

    // 转换为二进制
    std::ostringstream binary;
    binary << std::setbase(2) << num;
    std::cout << "Binary: " << binary.str() << std::endl; // 101010

    // 转换为八进制
    std::ostringstream octal;
    octal << std::setbase(8) << num;
    std::cout << "Octal: " << octal.str() << std::endl; // 52

    // 转换为十六进制
    std::ostringstream hex;
    hex << std::setbase(16) << num;
    std::cout << "Hexadecimal: " << hex.str() << std::endl; // 2a

    return 0;
}

1.3 手动实现进制转换

通过循环和取模运算,可以手动实现任意进制的转换。

#include <iostream>
#include <string>
#include <algorithm>

std::string decimalToBase(int num, int base) {
    if (num == 0) return "0";

    std::string result;
    while (num > 0) {
        int remainder = num % base;
        char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
        result.push_back(digit);
        num /= base;
    }

    // 反转字符串
    std::reverse(result.begin(), result.end());
    return result;
}

int main() {
    int num = 42;

    std::cout << "Binary: " << decimalToBase(num, 2) << std::endl;  // 101010
    std::cout << "Octal: " << decimalToBase(num, 8) << std::endl;   // 52
    std::cout << "Hexadecimal: " << decimalToBase(num, 16) << std::endl; // 2A

    return 0;
}

2. 将其他进制转换为十进制

2.1 使用 std::stoistd::stol

std::stoistd::stol 可以将字符串从指定进制转换为十进制。

#include <iostream>
#include <string>

int main() {
    std::string binary = "101010";
    std::string octal = "52";
    std::string hex = "2A";

    // 二进制转十进制
    int decimal1 = std::stoi(binary, nullptr, 2);
    std::cout << "Binary to Decimal: " << decimal1 << std::endl; // 42

    // 八进制转十进制
    int decimal2 = std::stoi(octal, nullptr, 8);
    std::cout << "Octal to Decimal: " << decimal2 << std::endl; // 42

    // 十六进制转十进制
    int decimal3 = std::stoi(hex, nullptr, 16);
    std::cout << "Hexadecimal to Decimal: " << decimal3 << std::endl; // 42

    return 0;
}

2.2 手动实现进制转换

通过循环和幂运算,可以手动实现任意进制到十进制的转换。

#include <iostream>
#include <string>
#include <cmath>

int baseToDecimal(const std::string& num, int base) {
    int decimal = 0;
    for (size_t i = 0; i < num.length(); i++) {
        char c = num[i];
        int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
        decimal = decimal * base + digit;
    }
    return decimal;
}

int main() {
    std::string binary = "101010";
    std::string octal = "52";
    std::string hex = "2A";

    std::cout << "Binary to Decimal: " << baseToDecimal(binary, 2) << std::endl; // 42
    std::cout << "Octal to Decimal: " << baseToDecimal(octal, 8) << std::endl;   // 42
    std::cout << "Hexadecimal to Decimal: " << baseToDecimal(hex, 16) << std::endl; // 42

    return 0;
}

3. 任意进制之间的转换

可以通过十进制作为中间桥梁,实现任意进制之间的转换。

#include <iostream>
#include <string>
#include <algorithm>

// 十进制转任意进制
std::string decimalToBase(int num, int base) {
    if (num == 0) return "0";

    std::string result;
    while (num > 0) {
        int remainder = num % base;
        char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
        result.push_back(digit);
        num /= base;
    }

    std::reverse(result.begin(), result.end());
    return result;
}

// 任意进制转十进制
int baseToDecimal(const std::string& num, int base) {
    int decimal = 0;
    for (size_t i = 0; i < num.length(); i++) {
        char c = num[i];
        int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
        decimal = decimal * base + digit;
    }
    return decimal;
}

// 任意进制之间的转换
std::string convertBase(const std::string& num, int fromBase, int toBase) {
    int decimal = baseToDecimal(num, fromBase);
    return decimalToBase(decimal, toBase);
}

int main() {
    std::string binary = "101010";
    std::string hex = convertBase(binary, 2, 16);
    std::cout << "Binary to Hexadecimal: " << hex << std::endl; // 2A

    return 0;
}

4. 总结

  • 使用 std::bitset 可以快速将整数转换为二进制。
  • 使用 std::ostringstreamstd::setbase 可以将整数转换为任意进制。
  • 使用 std::stoi 可以将字符串从指定进制转换为十进制。
  • 手动实现进制转换可以处理更复杂的需求。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐