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

 更新时间:2025年04月15日 10:28:05   作者:小鹏编程  
在C++中进行进制转换可以通过标准库函数或自定义算法实现,本文主要为大家整理了两种常见场景的转换方法及示例代码,有需要的小伙伴可以根据需求进行选择

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

1.任意进制转十进制

#include <string>
#include <iostream>int main() {
    std::string num = "1A3F"; // 十六进制数

    int decimal = stoi(num, nullptr, 16); // 第三个参数指定原始进制
    std::cout << decimal; // 输出:6719
}

2.十进制转其他进制

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

四、注意事项

有效性检查:需验证输入数值是否合法(如二进制不能包含2-9)

大小写处理:自定义函数默认处理大写字母,可修改toupper()为tolower()处理小写

负数处理:示例代码未处理负数,需要时可添加符号处理

大数支持:对于超过int范围的数值,建议使用字符串处理或long long类型

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

五、方法补充

使用printf语句实现进制转换

在C语言中,printf 函数可以直接实现部分进制转换功能,通过格式说明符(format specifier)快速输出不同进制的数值。以下是详细使用方法及示例代码:

一、printf 原生支持的进制转换

1. 十进制、八进制、十六进制转换

#include <stdio.h>

​​​​​​​int main() {
    int num = 255;
    
    // 十进制输出(默认)
    printf("十进制: %d\n", num);  // 255
    
    // 八进制输出(无前缀)
    printf("八进制: %o\n", num);  // 377
    
    // 十六进制输出(小写字母)
    printf("十六进制: %x\n", num); // ff
    
    // 十六进制输出(大写字母)
    printf("十六进制: %X\n", num); // FF
    
    return 0;
}

2. 显示进制前缀

#include <stdio.h>

int main() {
    int num = 255;
    
    // 显示八进制前缀 0
    printf("带前缀的八进制: %#o\n", num); // 0377
    
    // 显示十六进制前缀 0x/0X
    printf("带前缀的十六进制: %#x\n", num); // 0xff
    printf("带前缀的十六进制: %#X\n", num); // 0XFF
    
    return 0;
}

3. 指定输出宽度和填充

#include <stdio.h>

int main() {
    int num = 15;
    
    // 输出8位宽度,不足部分补前导零
    printf("补零的八进制: %#08o\n", num);  // 0000017
    printf("补零的十六进制: %#08x\n", num); // 0x00000f
    
    return 0;
}

二、printf 不支持的进制转换

1. 二进制输出(需要手动实现)

#include <stdio.h>

void print_binary(unsigned int num) {
    if (num > 1) print_binary(num >> 1);
    putchar((num & 1) ? '1' : '0');
}

int main() {
    int num = 10;
    printf("二进制: ");
    print_binary(num); // 1010
    return 0;
}

2. 任意进制转换(通用方法)

#include <stdio.h>
#include <string.h>void reverse(char* str) {
    int len = strlen(str);


    for (int i = 0; i < len/2; i++) {
        char temp = str[i];
        str[i] = str[len-1 - i];
        str[len-1 - i] = temp;
    }
}

void dec_to_base(unsigned int num, int base, char* output) {
    if (base < 2 || base > 36) {
        strcpy(output, "Invalid base");
        return;
    }

    const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int index = 0;
    
    do {
        output[index++] = digits[num % base];
        num /= base;
    } while (num > 0);
    
    output[index] = '\0';
    reverse(output);
}

​​​​​​​int main() {
    char buffer[32];
    dec_to_base(255, 2, buffer);
    printf("二进制: %s\n", buffer); // 11111111
    return 0;
}

三、输入其他进制的数值(scanf 的用法)

#include <stdio.h>

int main() {
    int num;
    
    // 输入十六进制数(如 FF)
    printf("输入十六进制数: ");
    scanf("%x", &num);
    printf("十进制值: %d\n", num); // 255
    
    // 输入八进制数(如 377)
    printf("输入八进制数: ");
    scanf("%o", &num);
    printf("十进制值: %d\n", num); // 255
    
    return 0;
}

四、注意事项

类型限制:

使用 %o, %x, %X 时,建议用 unsigned 类型,避免符号扩展问题:

unsigned int num = 255;
printf("%#x\n", num); // 正确输出 0xff

二进制输出优化:

// 使用宏定义快速输出二进制
#define PRINT_BINARY(n) \
    for (int i = sizeof(n)*8-1; i >= 0; i--) \
        putchar((n & (1 << i)) ? '1' : '0'); \
    putchar('\n')

int main() {
    PRINT_BINARY(10); // 00000000000000000000000000001010
    return 0;
}

大数处理:

对于超过 unsigned int 范围的数值,需使用字符串处理(类似 Python 的 int(string, base))。

通过 printf 可以直接实现八进制、十六进制的输出,二进制和其他进制需要手动实现。若需更复杂的进制转换(如浮点数转换或超大数处理),需结合字符串操作或数学库函数。

以上就是C++教程之进制转换的实现方法的详细内容,更多关于C++进制转换的资料请关注脚本之家其它相关文章!

相关文章

  • C++找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)

    C++找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)

    今天小编就为大家分享一篇关于C++找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言如何建立动态链表问题

    C语言如何建立动态链表问题

    这篇文章主要介绍了C语言如何建立动态链表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Visual Studio 2022 安装低版本 .Net Framework的图文教程

    Visual Studio 2022 安装低版本 .Net Framework的图文教程

    这篇文章主要介绍了Visual Studio 2022 如何安装低版本的 .Net Framework,首先打开 Visual Studio Installer 可以看到vs2022 只支持安装4.6及以上的版本,那么该如何安装4.6以下的版本,下面将详细介绍,需要的朋友可以参考下
    2022-09-09
  • C++简单实现RPC网络通讯的示例详解

    C++简单实现RPC网络通讯的示例详解

    RPC是远程调用系统简称,它允许程序调用运行在另一台计算机上的过程,就像调用本地的过程一样。本文将用C++简单实现RPC网络通讯,感兴趣的可以了解一下
    2023-04-04
  • Qt QWidget实现图片旋转动画

    Qt QWidget实现图片旋转动画

    这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • C语言程序打豆豆(函数版)

    C语言程序打豆豆(函数版)

    今天小编就为大家分享一篇关于C语言程序打豆豆(函数版),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C++ odr用法案例详解

    C++ odr用法案例详解

    这篇文章主要介绍了C++ odr用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 利用C++实现获取文件夹下所有文件名

    利用C++实现获取文件夹下所有文件名

    这篇文章主要为大家详细介绍了如何利用C++实现获取文件夹下所有文件名,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2022-09-09
  • C++ 中继承与动态内存分配的详解

    C++ 中继承与动态内存分配的详解

    这篇文章主要介绍了C++ 中继承与动态内存分配的详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • C++11 算法std::copy_if 与 std::copy_n详解

    C++11 算法std::copy_if 与 std::copy_n详解

    C++11新增std::copy_if与std::copy_n,前者条件筛选复制,后者固定数量复制,提升代码可读性与性能,适用于数据过滤及批量处理,需注意范围重叠与目标空间不足等陷阱,本文给大家介绍C++11算法std::copy_if 与 std::copy_n详解,感兴趣的朋友一起看看吧
    2025-07-07

最新评论