主页 > 互联网  > 

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

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

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


一、其他进制 → 十进制

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

示例:

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

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


二、十进制 → 其他进制

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

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

步骤:

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

示例: 将 ( 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. 小数部分转换(乘基取整)

步骤:

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

示例: 将 ( 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)
五、快速对照表 十进制二进制八进制十六进制00000001000111200102230011334010044501015560110667011177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F

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

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


1. 使用库函数快速转换 1.1 sprintf 和 sscanf 十进制转其他进制: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); // 输出八进制和十六进制
总结 简单场景:优先使用库函数(如sprintf、strtol)。自定义需求:手动实现算法(如递归、位运算)。性能优化:结合位运算或预计算表提升效率。
标签:

进制转换及C语言中进制转换方法由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“进制转换及C语言中进制转换方法