c++进制转换

在 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 可以将字符串从指定进制转换为十进制。
  • 手动实现进制转换可以处理更复杂的需求。
<think>好的,我现在需要帮助用户寻找关于C++中实现进制转换算法或代码示例。用户明确提到了“C++ 进制转换 算法 示例 代码 实现”,所以我要确保回答覆盖这些关键词,并提供具体的例子。 首先,我需要回忆一下C++中常见的进制转换方法。根据引用内容,用户提供的参考资料提到了几种方法,包括使用字符串流、stoi函数、bitset库,以及自定义的换函数。我需要整理这些方法,并给出清晰的代码示例。 首先,用户可能需要一个简单的十进制其他进制的例子。例如,十进制二进制、八进制或十六进制。引用[1]提到了十进制其他进制的算法,而引用[2]和[3]也提供了函数示例。我应该先展示一个自定义的函数,如decimalToBase,并解释其步骤,比如通过余数法循环处理。 其次,用户可能想知道如何从其他进制十进制。这里可以使用stoi函数,如引用[3]提到的,或者自定义函数如baseToDecimal。需要说明stoi的用法,以及处理不同进制输入的方法,比如字符串前的基数参数。 另外,引用[4]和[5]展示了具体的代码片段,比如二进制十进制和十六进制十进制的例子。我需要整合这些例子,可能给出不同进制之间的换步骤,比如先十进制目标进制。 还要注意,用户可能需要通用方法,比如任意进制之间的换。这时候可以建议先将输入换为十进制,然后再成目标进制。引用[5]中的示例就是先十进制十六进制,这样的两步法比较通用。 此外,可能需要提到使用标准库中的工具,比如sstream中的hex、oct、dec操纵器,或者bitset来处理二进制换。引用[3]提到了这些方法,可以简要说明它们的用法和限制,比如bitset固定位数的问题。 需要注意代码的正确性,比如处理大于10的进制时的字母表示,比如A-F代表10-15。在自定义函数中,需要有一个字符映射表,余数超过9时换为相应的字母。 还要考虑错误处理,比如输入的字符串是否符合指定的进制,但用户的问题可能更关注算法实现,所以可能不需要深入错误处理,但可以提及需要注意的地方。 最后,生成相关问题,可能涉及性能优化、不同方法的比较、特殊情况的处理等,如大数处理,或者非整数换,不过用户的问题可能集中在整数换上。 总结步骤: 1. 十进制其他进制(自定义函数) 2. 其他进制十进制(stoi或自定义) 3. 任意进制间换(通过十进制) 4. 使用标准库方法(sstream、bitset) 5. 注意事项(字母处理、错误检查) 6. 示例代码和说明 需要确保代码格式正确,使用```cpp包裹,并解释关键步骤。引用对应的参考文献,比如引用[1]、[2]、[3]等,在回答末尾添加引用标识。</think>### C++ 进制转换算法实现 #### 一、十进制其他进制(自定义函数) 通过余数法实现,支持2-36进制转换: ```cpp #include <algorithm> string decimalToBase(int num, int base) { if(num == 0) return "0"; string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string result; while(num > 0) { result += digits[num % base]; num /= base; } reverse(result.begin(), result.end()); return result; } ``` 示例:`decimalToBase(255, 16)` 返回 `"FF"`[^2] #### 二、其他进制十进制 1. **使用`stoi`函数**: ```cpp string binary = "1101"; int decimal = stoi(binary, 0, 2); // 参数:字符串,起始位置,进制 cout << decimal; // 输出13 ``` 2. **自定义实现**: ```cpp int baseToDecimal(string num, int base) { int result = 0; for(char c : num) { result = result * base + (isdigit(c) ? c-'0' : toupper(c)-'A'+10); } return result; } ``` #### 三、任意进制间换 通过十进制实现: ```cpp string convertBase(string num, int from, int to) { int decimal = baseToDecimal(num, from); return decimalToBase(decimal, to); } ``` #### 四、标准库方法 1. **字符串流**: ```cpp #include <sstream> stringstream ss; int num = 255; // 十六进制 ss << hex << num; // 得到"ff" // 八进制 ss << oct << num; // 得到"377" ``` 2. **bitset处理二进制**: ```cpp #include <bitset> int n = 13; bitset<8> bin(n); // 00001101 cout << bin.to_string(); // 输出完整二进制表示 ``` #### 五、注意事项 1. 字母统一使用大写形式 2. 进制范围限制在2-36 3. 负数处理需要额外判断 4. 大数值建议使用`long long`类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值