关于十进制转十六进制,网上的方法很多,但其中相当一部分是基于显示上的转换,或是利用一些其他的库或头文件。对初学者或是希望代码在单片机环境下运行的人来说,这些代码并不是非常有用。
本文基于本站一位作者的文章所给出的方法和代码进行了一些修改简化(链接如下),得出以下代码。
参考文章链接:https://blog.csdn.net/Deheng_Kong/article/details/115550227
代码实现:
此方法主要使用位操作对十进制数进行系列处理,得到对应十六进制数。
#include<stdio.h>
#define length_8 100
typedef unsigned short int usint;
usint HexData_8[length_8]; //用于缓存8位十六进制数的区域
/* --------------十进制(8位)数组转换为十六进制数组---------------- */
void Dec2Hex_8(usint* temp) //由于没有8位的数据类型,我们只能“假装”它是8位
{
int i,n,x,Rem;
usint Hex = 0xFF;
usint Dec = 0;
usint rem = 0; //定义余数变量
usint mer = 0; //定义商变量
for(i = 0;i < length_8;i++) //有几个数要转换,length_8就等于几
{
Dec = temp[i]; //取第i个十进制数进行操作
Hex = 0xFF; //用来写对应十六进制数的“十六进制格式白纸”
if(Dec >= 16 && Dec < 256){
for(n = 0;n < 2;n++){
rem = Dec % 16; //获得对应十六进制数的低位(低4位)
mer = Dec / 16; //获得对应十六进制数的高位(高4位)
Dec = mer;
Rem=(rem>>4|(rem<<4))+15; //获得0x'rem'F
Hex &=(Rem>>4|(Rem<<4)); //Hex&=0xF'rem' 每执行一次rem>>4|(rem<<4)将rem的高4位与低4位对调
Hex=(Hex>>4|((Hex<<4)-((Hex<<4)-(Hex<<4)%256)));
/*
上面这步比较麻烦,为的是将0xF'rem'变成0x'rem'F
但是这里的变量Hex并不是8位,0xFA<<4会变成0xFA0,而不是我想要的0xA0,大家懂我意思吧
所以要手动把最高的4位抹掉
*/
}
}
else if(Dec > 0 && Dec < 16){
for(x = 0;x < 1;x++){
rem = Dec % 16;
mer = Dec / 16;
Dec = mer;
Rem=(rem>>4|(rem<<4))+15;
Hex &=(Rem>>4|(Rem<<4));
Hex=(Hex>>4|((Hex<<4)-((Hex<<4)-(Hex<<4)%256)));
Hex>>=4;
}
}
else
{
Hex = 0x00;
}
HexData_8[i] = Hex;
}
}
/* ---------------------测试----------------------- */
int main(void){
int i=0;
usint x[100]={23,55,77,26,34,65,76,23,45,86,34,45,34,3,23,65,34,24,76,
34,78,43,23,46,23,56,84,34,74,34,56};
Dec2Hex_8(x);
for(i=0;i<30;i++){
if(x[i]!=HexData_8[i]){
printf("Wrong!\n,第%d个\n",i);
printf("十六进制数%02x",HexData_8[i]);
printf("不等于%d\n",x[i]);
}
}
printf("Right!");
return 0;
}
代码大概就是这样了,建议先看那位作者的代码会更易懂些。
最后我还粗略地测了下速度:
P1: 以上代码运行前
P2: 运行后
P3: 原作者代码运行前
P4: 运行后
以上代码运行时间: 0.000 78600
原作者代码运行时间:0.000 48850
(测速的代码原作者的代码我没有修改,也就是说是算16位十六进制数的代码,所以我这种写法虽然代码少一些,但是会慢很多)
如果大家发现上面有不对的的地方或是其他更好的想法,欢迎提出一起讨论。