C语言实现十进制转十六进制--为单片机编写(数据转换,并非单纯显示)

关于十进制转十六进制,网上的方法很多,但其中相当一部分是基于显示上的转换,或是利用一些其他的库或头文件。对初学者或是希望代码在单片机环境下运行的人来说,这些代码并不是非常有用。
本文基于本站一位作者的文章所给出的方法和代码进行了一些修改简化(链接如下),得出以下代码。

参考文章链接: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位十六进制数的代码,所以我这种写法虽然代码少一些,但是会慢很多)

如果大家发现上面有不对的的地方或是其他更好的想法,欢迎提出一起讨论。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川九-EveRYouNg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值