当前位置: 首页 > news >正文

【C++教程】进制转换的实现方法

在C++中进行进制转换可以通过标准库函数或自定义算法实现。以下是两种常见场景的转换方法及示例代码:

一、使用C++标准库函数

  1. 任意进制转十进制
#include <string>
#include <iostream>

int main() {
    std::string num = "1A3F"; // 十六进制数
    int decimal = stoi(num, nullptr, 16); // 第三个参数指定原始进制
    std::cout << decimal; // 输出:6719
}
  1. 十进制转其他进制
#include <bitset>
#include <iostream>

int main() {
    int num = 255;
    
    // 转二进制(8位)
    std::cout << std::bitset<8>(num) << "\n"; // 11111111
    
    // 转十六进制(小写)
    std::cout << std::hex << num << "\n"; // ff
    
    // 转八进制
    std::cout << std::oct << num; // 377
}

二、自定义转换函数(支持任意2-36进制)

1. 十进制转任意进制
#include <algorithm>
#include <string>

std::string dec_to_base(int num, int base) {
    if (base < 2 || base > 36) return "";
    
    std::string result;
    const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    while (num > 0) {
        result += digits[num % base];
        num /= base;
    }
    
    if (result.empty()) return "0";
    std::reverse(result.begin(), result.end());
    return result;
}

// 示例:dec_to_base(255, 16) 返回 "FF"
2. 任意进制转十进制
#include <cctype>
#include <string>

int base_to_dec(std::string num, int base) {
    if (base < 2 || base > 36) return -1;
    
    int result = 0;
    for (char c : num) {
        int value = isdigit(c) ? c - '0' : toupper(c) - 'A' + 10;
        if (value >= base) return -1; // 非法输入
        
        result = result * base + value;
    }
    return result;
}

// 示例:base_to_dec("FF", 16) 返回 255

三、完整示例代码

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

using namespace std;

// 十进制转任意进制(2-36)
string dec_to_base(int num, int base) {
    if (base < 2 || base > 36) return "Invalid base";
    
    string result;
    const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    do {
        result += digits[num % base];
        num /= base;
    } while (num > 0);
    
    reverse(result.begin(), result.end());
    return result.empty() ? "0" : result;
}

// 任意进制转十进制(2-36)
int base_to_dec(string num, int base) {
    if (base < 2 || base > 36) return -1;
    
    int result = 0;
    for (char c : num) {
        int value = isdigit(c) ? c - '0' : toupper(c) - 'A' + 10;
        if (value >= base) return -1;
        
        result = result * base + value;
    }
    return result;
}

int main() {
    // 十进制255转十六进制
    cout << dec_to_base(255, 16) << endl; // 输出FF
    
    // 二进制11111111转十进制
    cout << base_to_dec("11111111", 2) << endl; // 输出255
    
    // 三十六进制转换示例
    cout << dec_to_base(1234, 36) << endl; // 输出YA
    cout << base_to_dec("YA", 36) << endl;  // 输出1234
    
    return 0;
}

四、注意事项

  1. 有效性检查:需验证输入数值是否合法(如二进制不能包含2-9)
  2. 大小写处理:自定义函数默认处理大写字母,可修改toupper()tolower()处理小写
  3. 负数处理:示例代码未处理负数,需要时可添加符号处理
  4. 大数支持:对于超过int范围的数值,建议使用字符串处理或long long类型

如果需要处理超大数(超过long long范围),需要使用字符串进行逐位计算的算法。这里展示的是最常用的基本实现方法。

相关文章:

  • Docker的部署和基本操作
  • 2024团体程序设计天梯赛L3-1 夺宝大赛
  • 【ROS2】行为树 BehaviorTree(二):传递参数(黑板和端口)
  • day28图像处理OpenCV
  • 服务器本地搭建
  • FPGA_UART
  • 刷题记录(3)C语言中的字符
  • LlamaIndex学习
  • Fiddler为什么可以看到一次HTTP请求数据?
  • 项目班——0408
  • 【神经网络】python实现神经网络(四)——误差反向传播的基础理论
  • AI与我共创WEB界面
  • 风丘年度活动:2025年横滨汽车工程展览会
  • java中常用的集合 - 面试篇
  • 【NIO番外篇】之组件 Selector
  • 【Redis】布隆过滤器应对缓存穿透的go调用实现
  • malloc、operator new、new的关系
  • c语言练习4
  • NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)
  • 常见攻击方式及防范措施
  • 30平米的无障碍酒吧里,我们将偏见折叠又摊开
  • 明查| 新一代AI诊疗系统可3秒筛查13种癌症?没有证据
  • 新能源汽车,告别混乱创新
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 美国和沙特签署上千亿美元军售协议
  • 中保协发布《保险机构适老服务规范》,全面规范保险机构面向老年人提供服务的统一标准