C/C++每日一问--进制转换

6月收官,7月伊始,2020,进入暑期。

考研迎来了一个比较关键的时期,从现在开始进行专业课–C/C++的复习,为了保证学习质量、夯实基础,特别设置【每日一问】专栏,对自己的学习成果进行实践检验以及知识拓展,裂变自己接触和学习过的知识及技巧;主要是理论和实践相结合,以基础知识为主,实践操作为辅,保证学习效果,和大家一起回顾知识,共同进步,加油!

特别提示:【每日一问】栏目包括但不限于【今日主题】、【实践演练】、【知识裂变】等模块,内容比较基础,适合新手学习以及熟手进行知识回顾,大神勿喷,请自动绕道,谢谢!

1今日主题-进制转换

今天我们先来学习一下进制转换,主要包括十进制与二进制、八进制、十六进制之间的相互转换。

提示:

二进制:由0、1组成,末尾加B表示二进制;

八进制:由0~7中数字的组成,末尾加Q表示八进制;

十进制:由0~9中的数字组成,末尾加D表示十进制;

十六进制:由0-9、A(10)~F(15)中的数字、字母组成,末尾加H表示十六进制;

1、十进制–>“R”进制,R=2、8、16

整数:除R取余法;

小数:乘R取整法;

比如十进制转二进制:

整数:除2取余,按高位-低位排列,具体如下图:
在这里插入图片描述
小数:乘2取整,按高位-低位排列,具体如下图:
在这里插入图片描述

2、“R”进制转十进制,R=8、16

根据进制进行求解:

八转十:26Q = 281+ 680 = 22D;

十六转十:26H = 2161+ 6160 = 38D。

3、二进制转“R”进制,R=8、10、16

二转八:取三合一;位数从高到低代表22、21、20,数字相乘加起来就是转换后的数字,如:10 100 101 B,转换为八进制为:245Q;

二转十六:取四合一;位数从高到低代表23、22、21、20,数字相乘加起来就是转换后的数字;

如:1001 0101 B,转换为十六进制为:a5H;

二转十:位数从高到低代表2n、…、23、22、21、20,数字相乘加起来就是转换后的数字;

如:11001 B,124 + 123 + 022 +021 + 1*20 = 25 D。

2实践演练-代码实现

在实际应用中,我们有时候会遇到需要使用进制转换功能,比如设计串口助手上位机时,有个16进制显示的功能,这时候需要进行进制转换。

上面咱们已经学习了进制转换的基本原理,接下来咱们就应该思考整理,如何编写代码实现进制转换的功能。
下面是16进制转10进制的代码:语言:C++,开发环境:VS2015。
程序已经过调试,输出无问题,16进制大小写都适用。

// lab02_hextodec.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <string>
using namespace std;

int main()
{
	long long hexTurnToDec(string h);// 声明转换函数

	string hexinA, hexina;			// 定义输入十六进制,分别为大写和小写
	long long decoutA, decouta;		// 定义输出十进制,分别为大写和小写的输出

	cin >> hexinA >> hexina;		//输入十六进制
	decoutA = hexTurnToDec(hexinA);	// 转换
	decouta = hexTurnToDec(hexinA);
	cout << decoutA << endl << decouta << endl;// 输出

	system("pause");
	return 0;
	
}

// 十六进制转十进制,大小写均可
long long hexTurnToDec(string h)
{
	int hexlen = h.size();// 获取长度
	long long decSum = 0;
	//十六进制转换十进制
	for (int i = 0; i<hexlen; i++)
	{
		//判断h[i]是否在A-F或a-f范围,是则与‘A’或'a'字符相减计算,否则与‘0’相减计算		
		if (h[i] >= 'A' && h[i] <= 'F')
		{
			decSum += (long long)(h[i] - 'A' + 10) * (long long)pow(16.0, hexlen - i - 1);//pow(x,y)返回 x 的 y 次幂,即 x^y
		}
		else if (h[i] >= 'a' && h[i] <= 'f')
		{
			decSum += (long long)(h[i] - 'a' + 10) * (long long)pow(16.0, hexlen - i - 1);//pow(x,y)返回 x 的 y 次幂,即 x^y
		}
		else decSum += (h[i] - '0') * (int)pow(16.0, hexlen - i - 1);
	}
	return decSum;
}

3知识裂变-拓展学习

16进制转10进制用C语言如何实现呢?

温馨提示:C语言中没有string的关键字的,一般我们是数组进行字符的存储来进行计算,然后通过scanf和printf函数进行输入和输出。赶快去试一试吧。

问:用单片机做万年历,所使用的时钟芯片DS1302读取时间和设置时间时需要用到什么进制转换?

扫描二维码关注我

二维码.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值