深入浅出详解进制转换

发布时间:2025-12-09 18:04:10 浏览次数:4

1.进制转换

1.十进制转其他进制

1.整数转换(短除法)
  • 以十进制数520为例,分别转换为二进制、八进制、十六进制,转换过程如下:
  • 短除法:转进制除以几,余数倒过来为结果
2.小数转换
  • 例如:转换为2进制:用2乘以小数部分,每次都将结果整数取出,然后用剩余小数部分继续乘以2,直到小数部分为零,或者达到要求的精度为止

2.其他进制转十进制:位权相加

位权相加:

  • 首先,需要对其他进制进行编号,个位为0,整数部分从右往左依次为0 1 2 3 4…,小数部分从左往右依次为 -1 -2 -3 -4…
  • 然后,把每一位的数通过这个公式计算:数值*基数(该数是几进制)编号,然后把结果相加,即得到转换结果
1.二进制10 0000 1000 转十进制
98 7654 3210 编号10 0000 1000 B1*2^9+1*2^3=520D(结果)
2.八进制1010转十进制
3210 编号1010 O1*8^3+1*8^1=520D(结果)
3.十六进制208转十进制
210 编号208 H2*16^2+8*16^0=520H(结果)
4.二进制转十进制带小数
543210 -1 -2 -3 编号100001. 1 0 1 B1*2^5+1*2^0+1*2^-1+1*2^-3=33.625

八进制、十六进制与二进制相互转换(拆位与合位)

  • 八进制与二进制:一个八进制数可以拆分为3个二进制数,3个二进制数可以合成一个八进制数

    //二进制转八进制001 000 001 000 B1 0 1 0 O//八进制转二进制1 3 1 4 5 2 0 O001 011 001 100 101 010 000 B
  • 十六进制与二进制:一个十六进制数可以拆分为4个二进制数,4个二进制数可以合成一个十六进制数

    //二进制转十六进制0010 0000 1000 B2 0 8 H//十六进制转二进制1 3 1 4 5 2 0 H0001 0011 0001 0100 0101 0010 0000 B
为什么可以这样拆位与合位
  • 三位二进制数表示的范围是0-8 ——> 23 对于八进制来说刚刚好
  • 四位二进制数表示的范围是0-16 —–> 24 对于16进制来说刚刚好

2.进制转换练习

1.1-1.二进制转十进制

从键盘输入二进制串(可以带小数,也可以不带小数),编写程序将其转换成二进制并输出。
样例输入:100001.101
样例输出:33.625

#include<stdio.h>#include<string.h>#include<math.h>void transition2_10(char str[], int point, int len);int main(){char str[100] = { 0 };gets_s(str, 100);int point = 0, len = strlen(str);for ( int i = 0; i < len; i++){if(str[i]=='.'){point = i;break;}point = i+1; //point指向整数的后一位}transition2_10(str, point, len);return 0;}void transition2_10(char str[], int point, int len){long left_Sum = 0;double right_Sum = 0;int right = 0, left = -1;for (int i = point; i > 0; i--) //整数部分的和{left_Sum += (str[i - 1] - '0') * pow(2, right); //-'0'把字符转换为整数right++;}for (int j = point+1 ; j < len; j++) //小数部分的和{right_Sum += (str[j] - '0') * pow(2, left);left--;}printf("%f", right_Sum + left_Sum);}

2.1-2.十进制整数转二进制

样例输入:267
样例输出:100001011
提示:可用下列方法实现
(1)用逻辑与运算、逻辑左移判断某一位是否为1(不能使用数组、字符串函数)
(2)用数组实现
(3)用字符串函数实现

#include <stdio.h>#define _Max 32int main(){int m = 0, n = 0;int sum[_Max] = { 0 };scanf("%d", &m);while ( m ){sum[n++] = m % 2;m /= 2;}for (int i = n-1; i >= 0 ; i--){printf("%d", sum[i]);}return 0;}

3.1-3.十进制小数转二进制

样例输入:0.71875
样例输出:0.10111
说明:小数点后不超过10位

#include<stdio.h>int main(){double n;scanf("%lf", &n);printf("0.");while ( n > 0 ){n *= 2;if (n >= 1){printf("1");n -= 1;}else{printf("0");}}return 0;}

4.1-4.带小数的十进制转二进制

(2017蓝桥杯湖北师范大学校内选拔赛试题)
样例输入:327.671875
样例输出:10100 0111.101011
说明:小数点后不超过10位

#include<stdio.h>#define _Max 32void transition10_2(double k);int main(){double m;scanf("%lf", &m);transition10_2(m);return 0;}void transition10_2(double k){double n;int x = 0, a[_Max] = { 0 }, i = 0;x = (int)k; //整数部分n = k - x; //小数部分while (x){a[i++] = x % 2;x /= 2;}for (int j = i - 1; j >= 0; j--){printf("%d", a[j]);}if (n > 0){printf(".");}while (n > 0){n *= 2;if (n >= 1){printf("1");n -= 1;}else{printf("0");}}}

5.1-5.十六进制转二进制

样例输入:16AC9
样例输出:1 0110 1010 1100 1001

#include <stdio.h>#include <string.h>#define N 100int main(){int i = 0;char ch, a[N] = { 0 };while ((ch = getchar()) != '\n'){switch ( ch ){case '0':strcat(a, "0000");break;case '1':strcat(a, "0001");break;case '2':strcat(a, "0010");break;case '3':strcat(a, "0011");break;case '4':strcat(a, "0100");break;case '5':strcat(a, "0101");break;case '6':strcat(a, "0110");break;case '7':strcat(a, "0111");break;case '8':strcat(a, "1000");break;case '9':strcat(a, "1001");break;case 'A':strcat(a, "1010");break;case 'B':strcat(a, "1011");break;case 'C':strcat(a, "1100");break;case 'D':strcat(a, "1101");break;case 'E':strcat(a, "1110");break;case 'F':strcat(a, "1111");break;}}while (a[(i++)] == '0');puts(a + i - 1);return 0;}
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477