关于十进制转十六进制,网上的方法很多,但其中相当一部分是基于显示上的转换,或是利用一些其他的库或头文件。对初学者或是希望代码在单片机环境下运行的人来说,这些代码并不是非常有用。 本文基于本站一位作者的文章所给出的方法和代码进行了一些修改简化(链接如下),得出以下代码。
参考文章链接: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];
void Dec2Hex_8(usint* temp)
{
int i,n,x,Rem;
usint Hex = 0xFF;
usint Dec = 0;
usint rem = 0;
usint mer = 0;
for(i = 0;i < length_8;i++)
{
Dec = temp[i];
Hex = 0xFF;
if(Dec >= 16 && Dec < 256){
for(n = 0;n < 2;n++){
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)));
}
}
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位十六进制数的代码,所以我这种写法虽然代码少一些,但是会慢很多)
如果大家发现上面有不对的的地方或是其他更好的想法,欢迎提出一起讨论。
|