700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言十六进制转换成十进制(代码) 可将数组内的十六进制数转换后并存入数组

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

时间:2023-11-11 05:44:23

相关推荐

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∗20+0∗21+1∗22+1∗23+0∗24+1∗25+1∗26+0∗27+1∗28+1∗29+1∗210+1∗211+1∗212+0∗213+0∗214+0∗215f = 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^15f=0∗20+0∗21+1∗22+1∗23+0∗24+1∗25+1∗26+0∗27+1∗28+1∗29+1∗210+1∗211+1∗212+0∗213+0∗214+0∗215最后算得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; //则加0Hex >>= 1;}}DecData_16[i] = Dec;}}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。