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

进制转换及C语言中进制转换方法

进制转换是计算机科学和数学中的基础操作,主要用于不同数制之间的数值表示转换。以下是常见进制(二进制、八进制、十进制、十六进制)的转换方法及示例:


一、其他进制 → 十进制

方法:按权展开,逐位相加。
公式
[ \text{十进制值} = \sum (每一位数值 \times 基数^{\text{位权}}) ]

示例

  1. 二进制 → 十进制
    ( 1011_2 = 1×2^3 + 0×2^2 + 1×2^1 + 1×2^0 = 8 + 0 + 2 + 1 = 11_{10} )

  2. 十六进制 → 十进制
    ( 2A_{16} = 2×16^1 + 10×16^0 = 32 + 10 = 42_{10} )


二、十进制 → 其他进制

方法:除基取余法(整数部分)或乘基取整法(小数部分),倒序排列余数。

1. 整数部分转换(除基取余)

步骤

  1. 用十进制数除以目标进制基数,记录余数。
  2. 将商继续除以基数,直到商为0。
  3. 余数倒序排列即为结果。

示例
将 ( 25_{10} ) 转换为二进制:
[
\begin{align*}
25 ÷ 2 &= 12 \ \text{余} \ 1 \
12 ÷ 2 &= 6 \ \ \ \text{余} \ 0 \
6 ÷ 2 &= 3 \ \ \ \text{余} \ 0 \
3 ÷ 2 &= 1 \ \ \ \text{余} \ 1 \
1 ÷ 2 &= 0 \ \ \ \text{余} \ 1 \
\end{align*}
]
倒序排列余数:( 11001_2 )

2. 小数部分转换(乘基取整)

步骤

  1. 用小数部分乘以目标进制基数,记录整数部分。
  2. 取结果的小数部分继续乘以基数,直到小数部分为0或达到精度要求。
  3. 整数部分正序排列即为结果。

示例
将 ( 0.625_{10} ) 转换为二进制:
[
\begin{align*}
0.625 × 2 &= 1.25 \quad \text{取整} \ 1 \
0.25 × 2 &= 0.5 \quad \ \ \text{取整} \ 0 \
0.5 × 2 &= 1.0 \quad \ \ \text{取整} \ 1 \
\end{align*}
]
正序排列整数部分:( 0.101_2 )


三、非十进制之间的直接转换

1. 二进制 ↔ 八进制/十六进制
  • 二进制 → 八进制:每 3位 二进制为一组,转换为1位八进制(不足补零)。
    示例
    ( 101\ 110_2 ) → ( 5_8 \ 6_8 = 56_8 )

  • 二进制 → 十六进制:每 4位 二进制为一组,转换为1位十六进制(不足补零)。
    示例
    ( 1101\ 0110_2 ) → ( D_{16} \ 6_{16} = D6_{16} )

  • 反向转换:将八进制/十六进制每一位展开为3/4位二进制。
    示例
    ( 3F_{16} = 0011\ 1111_2 )

2. 八进制 ↔ 十六进制

需以二进制或十进制为中间桥梁。
示例
( 75_8 → 111\ 101_2 → 0011\ 1101_2 → 3D_{16} )


四、进制表示符号

  • 二进制:前缀 0b(如 0b1010
  • 八进制:前缀 0(如 017
  • 十六进制:前缀 0x(如 0x1A

五、快速对照表

十进制二进制八进制十六进制
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F

掌握这些方法后,可灵活实现任意进制间的转换!

在C语言中实现进制转换可以通过多种方法,涵盖标准库函数、手动算法及位运算等。以下是常见方法及示例:


1. 使用库函数快速转换

1.1 sprintfsscanf
  • 十进制转其他进制
    int num = 255;
    char hex[10], oct[10];
    sprintf(hex, "%X", num);  // 十进制→十六进制,输出FF
    sprintf(oct, "%o", num);  // 十进制→八进制,输出377
    
  • 其他进制转十进制
    sscanf("FF", "%x", &num);  // 十六进制→十进制,num=255
    sscanf("377", "%o", &num); // 八进制→十进制,num=255
    
    支持十六进制(%x)、八进制(%o)和十进制(%d)的格式化输入输出。
1.2 strtol 函数

可将任意进制字符串转换为十进制:

char hex[] = "1A";
long decimal = strtol(hex, NULL, 16); // 十六进制→十进制,结果为26

参数16可替换为其他基数(如2、8)。


2. 手动实现转换算法

2.1 十进制转其他进制(除基取余法)

示例:十进制转二进制

void decimalToBinary(int n) {
    int binary[32], i = 0;
    while (n > 0) {
        binary[i++] = n % 2;
        n /= 2;
    }
    for (int j = i-1; j >= 0; j--) 
        printf("%d", binary[j]); // 输出余数倒序
}

类似方法可扩展至八进制、十六进制(需处理余数≥10时用字母表示)。

2.2 其他进制转十进制(按权展开法)

示例:二进制转十进制

int binaryToDecimal(char *binaryStr) {
    int decimal = 0, len = strlen(binaryStr);
    for (int i = 0; i < len; i++) {
        if (binaryStr[len-i-1] == '1')
            decimal += (1 << i); // 位权累加
    }
    return decimal;
}

此方法支持任意进制,需根据基数调整计算逻辑。


3. 位运算优化

适用于二进制与其他进制的快速转换:

void decimalToBinary(int num) {
    for (int i = 31; i >= 0; i--) 
        printf("%d", (num >> i) & 1); // 逐位提取二进制位
}

此方法直接操作内存中的二进制位,效率较高。


4. 处理不同进制的输入输出

  • 直接表示
    int oct = 077;   // 八进制(前缀0)
    int hex = 0xFF;  // 十六进制(前缀0x)
    
  • 格式化输出
    printf("%o %x", oct, hex); // 输出八进制和十六进制
    

总结

  • 简单场景:优先使用库函数(如sprintfstrtol)。
  • 自定义需求:手动实现算法(如递归、位运算)。
  • 性能优化:结合位运算或预计算表提升效率。

相关文章:

  • Git中revert和reset区别?
  • 如何将MySQL数据库迁移至阿里云
  • Pipeline 获取 Jenkins参数
  • 二叉树(数据结构)
  • 第5章:在LangChain中如何使用AI Services
  • 45.日常算法
  • 【算法通关村 Day6】二叉树层次遍历
  • Leetcode 76 Minimum Window Substring
  • 哈希表(概念)c++
  • 数据结构——模拟栈例题B3619
  • ShardingSphere 数据库中间件【详解大数据量下分库分表,读写分离,主从同步,以及ShardingSphere-JDBC使用,附有示例+代码】
  • 简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
  • 机器学习实战(10):深度学习初探——卷积神经网络(CNN)
  • OpenGL(2)基于Qt做OpenGL开发
  • 深⼊理解指针(1)
  • 电脑想安装 Windows 11 需要开启 TPM 2.0 怎么办?
  • 从零开始学习PX4源码9(部署px4源码到gitee)
  • 低代码表单引擎刷新机制
  • Redis 存在线程安全问题吗?为什么?
  • 排查JVM的一些命令
  • 有什么兼职做it的网站/香港旺道旺国际集团
  • 建站报价/成都百度seo推广
  • 山东宏远建设有限公司网站/国外seo
  • 如何做招生网站/指数是什么意思
  • 我们不是做网站的/seo关键词优化指南
  • 学做网站要多久/安卓优化大师手机版