C语言十六进制转换成十进制(代码),可将数组内的十六进制数转换后并存入数组

十六进制转换十进制原理介绍

十六进制转换为十进制,是先要将十六进制转换为二进制,在通过二进制转换为十进制。
十六进制转换为二进制很简单,我们首先要明白,一位十六进制代表四位二进制,如F对应二进制的1111,A代表二进制的1010,利用这种一一对应的关系,很容易就把十六进制转换为二进制,如0x1F6C,其中十六进制1对应二进制0001,十六进制F对应二进制1111,十六进制6对应二进制0110,十六进制C对应二进制1100,那么十六进制数0x1F6C对应的二进制数就是0001 1111 0110 1100。
得到对应的二进制数后,再将二进制转换为十进制,这一步就更简单了,只需要套一个公式即可,二进制右边为低位,左边为高位,最右边的第一个数代表2的0次方,自右往左依次递增,1、2、3、4…,十六位的二进制数最高位就是2的16 - 1 = 15次方(因为最低位从0开始),将二进制每一位上的数作为系数,与该位对应的次方相乘,再将所有位算得的结果相加,最后得到的数便是二进制对应的十进制数。我们拿0001 1111 0110 1100为例,公式便为 f = 0 ∗ 2 0 + 0 ∗ 2 1 + 1 ∗ 2 2 + 1 ∗ 2 3 + 0 ∗ 2 4 + 1 ∗ 2 5 + 1 ∗ 2 6 + 0 ∗ 2 7 + 1 ∗ 2 8 + 1 ∗ 2 9 + 1 ∗ 2 1 0 + 1 ∗ 2 1 1 + 1 ∗ 2 1 2 + 0 ∗ 2 1 3 + 0 ∗ 2 1 4 + 0 ∗ 2 1 5 f = 0*2^0 + 0*2^1+1*2^2 + 1*2^3+0*2^4 + 1*2^5+1*2^6 + 0*2^7+1*2^8 + 1*2^9+1*2^10 + 1*2^11+1*2^12 + 0*2^13+0*2^14 + 0*2^15 f=020+021+122+123+024+125+126+027+128+129+1210+1211+1212+0213+0214+0215最后算得f = 8044,那么8044就是二进制0001 1111 0110 1100所对应的十进制数,同样也是十六进制数0x1F6C对应的十进制数。
我们通篇以十六位的数来讲解的,其余位的数举一反三即可,原理相同。

代码实现

有了相关的知识之后,我们便可以很容易将代码实现

#include "stdio.h"
#include "math.h"
unsigned short int DecData_16[4];      //用于存储十进制数,数组的大小根据自己的实际情况进行修改
/* -------------------十六进制(十六位)转换为十进制--------------------- */
void Hex2Dec_16(unsigned short int* temp)
{
	for(int i = 0;i < 4;i++)    //这里是4个十六进制数,所以只循环四次,根据自己的实际情况修改
	{
		unsigned short int Hex = temp[i];
		unsigned short int Dec = 0;
		for(int j = 0;j < 16;j++)   //16表示一个十六进制数一共16位,根据自己的实际情况进行修改
		{
			if(Hex & 0x0001)   //判断十六进制数对应的二进制的最后是0还是1,所以十六进制转换为二进制这一步工作代码暗中就已经实现了
			{
				Dec += pow(2,j);    pow(2,j)是math.h头文件里的库函数,进行次方运算
				Hex >>= 1;   //这里的移位操作是对十六进制对应的二进制进行操作,不需要我们进行转换
			}
			else   //如果最后一位不是1
			{
				Dec += 0;   //则加0
				Hex >>= 1;
			}
		}
		DecData_16[i] = Dec;
	}
}

到此为止我们便实现了十六进制到十进制的转换,关于十进制转换为十六进制,请参考链接: STM32 十进制转换成十六进制的实现(有例程),在Keil5里面用C语言实现,不用scanf函数.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值