深入浅出详解进制转换

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

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

相关文章
|
关系型数据库 MySQL 数据库
rds迁移数据迁移工具选择
rds迁移数据迁移工具选择
730 3
|
应用服务中间件 nginx
Nginx日志格式不生效
Nginx日志格式不生效
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
886 2
|
4月前
|
前端开发 小程序 JavaScript
A2UI 规范与 AG-UI 协议:打造高效协同的界面开发体系
A2UI规范与AG-UI协议构建“设计-开发”协同闭环:前者统一视觉与交互标准,后者定义组件通信与跨平台适配,二者融合提升协作效率、保障体验一致,推动界面开发向标准化、可复用、高效能演进。
2303 0
|
9月前
|
敏捷开发 存储 JSON
任务分类归档工具深度评测:提升工作流管理的秘密武器
在项目管理中,任务分类归档工具能有效提升团队效率,确保任务有序执行与信息高效管理。本文介绍其重要性、核心功能、应用场景及使用技巧,并推荐多款实用工具,助力团队高效协作、精准交付项目目标。
|
人工智能 自然语言处理
使用企业微信或公众号自动回复图片消息
AppFlow支持企业微信和公众号接收图片消息,并提供两种回复方式。方式一:直接回复图片消息,用户发送图片后立即收到回复,但无法继续追问。方式二:先保存图片,待用户发送文字后再一并处理并回复。配置步骤包括选择模板、配置鉴权信息、设置执行动作参数及发布连接流。详细操作可参考相关文档。
1546 1
使用企业微信或公众号自动回复图片消息
|
9月前
|
机器学习/深度学习 安全 API
通过UID非法获取手机号的违法行为与技术逻辑剖析别异想天开了-优雅草卓伊凡
通过UID非法获取手机号的违法行为与技术逻辑剖析别异想天开了-优雅草卓伊凡
2851 0
通过UID非法获取手机号的违法行为与技术逻辑剖析别异想天开了-优雅草卓伊凡
|
人工智能 数据库 决策智能
Archon – 开源 AI 智能体框架,自主生成代码构建 AI 智能体
Archon 是一个开源的 AI 智能体框架,能够自主生成代码并优化智能体性能,支持多智能体协作、领域知识集成和文档爬取等功能,适用于企业、教育、智能家居等多个领域。
1221 10
Archon – 开源 AI 智能体框架,自主生成代码构建 AI 智能体
|
数据采集 存储 监控
实现自动化数据抓取:使用Node.js操控鼠标点击与位置坐标
本文介绍了如何使用Node.js和Puppeteer实现自动化数据抓取,特别是针对新闻网站“澎湃新闻”。通过设置代理IP、User-Agent和Cookie,提高爬虫的效率和隐蔽性,避免被网站封锁。代码示例展示了如何模拟鼠标点击、键盘输入等操作,抓取并整理新闻数据,适用于需要规避IP限制和突破频率限制的场景。
744 10
|
人工智能 搜索推荐 vr&ar
让教育更智能:HarmonyOS助力AI类目标签革新教育行业
在科技飞速发展的当下,教育行业正经历深刻变革,智能化转型成为提升教育质量与效率的关键。AI类目标签技术脱颖而出,通过分析学生多维度数据生成个性化学习标签,助力因材施教;智能管理教学资源,提高备课效率。HarmonyOS NEXT API 12及以上版本的分布式能力和强大的数据安全机制,为多设备协同学习和数据保护提供了有力支持。开发者可利用鸿蒙生态构建创新教育应用,推动教育智能化发展。
431 2

热门文章

最新文章