深入浅出详解进制转换

简介: 深入浅出详解进制转换

1.进制转换

59089fb00c1549cba243b0eb189a7903.png

目录

1.进制转换

1.十进制转其他进制

1.整数转换(短除法)

2.小数转换

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

1.二进制10 0000 1000 转十进制

2.八进制1010转十进制

3.十六进制208转十进制

4.二进制转十进制带小数

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

为什么可以这样拆位与合位

2.进制转换练习

1.1-1.二进制转十进制

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

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

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

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

1.十进制转其他进制

1.整数转换(短除法)
  • 以十进制数520为例,分别转换为二进制、八进制、十六进制,转换过程如下:

fac43f7a54af4e5f948e945440d63b8b.png

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

712bd4b0f3524a70aace2e9a42203148.png

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

位权相加:

首先,需要对其他进制进行编号,个位为0,整数部分从右往左依次为0 1 2 3 4…,小数部分从左往右依次为 -1 -2 -3 -4…

然后,把每一位的数通过这个公式计算:数值*基数(该数是几进制)编号,然后把结果相加,即得到转换结果

1.二进制10 0000 1000 转十进制

98 7654 3210 编号

10 0000 1000 B

1*2^9+1*2^3=520D(结果)

2.八进制1010转十进制

3210 编号

1010 O

1*8^3+1*8^1=520D(结果)

3.十六进制208转十进制

210 编号

208 H

2*16^2+8*16^0=520H(结果)

4.二进制转
十进制带小数

0f3fba0e246546ab886dd40034896b4f.png

543210 -1 -2 -3 编号

100001. 1  0  1 B

1*2^5+1*2^0+1*2^-1+1*2^-3=33.625

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

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

//二进制转八进制

001 000 001 000 B

1   0   1   0  O

 

//八进制转二进制

1   3   1   4   5   2   0  O

001 011 001 100 101 010 000 B

十六进制与二进制:一个十六进制数可以拆分为4个二进制数,4个二进制数可以合成一个十六进制数

//二进制转十六进制

0010 0000 1000 B

2     0    8  H

 

//十六进制转二进制

1    3    1    4    5    2    0   H

0001 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 32

int 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 32

void 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 100

int 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;

}

版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_72157449/article/details/128476709

相关文章
【面试题精讲】如何将二进制转为十六进制
【面试题精讲】如何将二进制转为十六进制
|
2月前
|
存储 算法 C语言
C语言程序设计核心详解 第一章:数制及转换与ASCII码
本专栏旨在夯实C语言基础,涵盖基础知识与进阶内容,助力解决自命题考试和考研问题,为数据结构与算法设计奠定坚实基础。内容包括数制及其转换、ASCII码、内存管理、机器码等,重点讲解二进制、八进制、十六进制的概念与转换方法,并介绍C语言的结构、数据类型和标识符规范。
|
6月前
|
存储 算法 程序员
探索C/C++ 进制转换之美:从原理到应用(一)
探索C/C++ 进制转换之美:从原理到应用
105 0
|
6月前
|
算法 C++
探索C/C++ 进制转换之美:从原理到应用(三)
探索C/C++ 进制转换之美:从原理到应用
65 0
|
6月前
|
存储 网络协议 算法
探索C/C++ 进制转换之美:从原理到应用(二)
探索C/C++ 进制转换之美:从原理到应用
171 0
|
存储 数据处理
二进制是干什么的?如何才能学好二进制?底层原理是什么?
二进制是干什么的?如何才能学好二进制?底层原理是什么?
257 0
|
Web App开发 安全 前端开发
谈谈二进制安全学习路线
前言 之前有个年轻的朋友问我二进制安全怎么学习,有没有什么学习路线,还问我有没有什么培训机构可以推荐,今天我特地写一篇文章来解答这个问题; 笔者个人将二进制研究方向分为以下几个(可能不同的人有不同的看法): 1.windows平台 2.Linux平台 3.mac平台 3.android和ios平台 4.浏览器 5.模糊测试(Fuzzing)技术(注意:这种技术可以在上面所有平台使用,不过不同的平台使用的工具方法有差异)
572 3
|
PHP 开发者
进制转换| 学习笔记
快速学习进制转换。
进制转换| 学习笔记
|
算法 Java
进制转换(二) - 进阶
进制转换(二) - 进阶
152 0
进制转换(二) - 进阶
|
算法 Java 编译器
进制转换(一) - 入门
进制转换(一) - 入门
252 0