简单的十进制123转十六进制0x123,字符串比数字转换慢10倍

分类:MFC 标签:MFC, IT, 编程, WinCE

环境VC
这不是十进制转十六进制.... 十进制和十六进制是不需要转换, 但是有时会用到十进制数当成十六进制数来进行计算.
例如十进制的123当成0x123来使用.
吾的做法有两种, 1.十进制数格式化输出成字符串, 然后字符串格式化输入成十六进制数; 2.十进制数除以10取余,余数乘16的(位数-1)次方, 商继续除以10直到为0.

//字符串处理_十进制转十六进制
UINT64 sD2H(UINT64 d)
{
	UINT64 h = 0;
	char buf[128] = {0};
	sprintf_s(buf, 128, "%I64u", d);
	sscanf_s(buf, "%I64x", &h);
	return h;
}
//计算处理_十进制转十六进制
UINT64 mD2H(UINT64 d)
{
	UINT64 h = 0;
	UINT64 offset = 1;
	while(d)
	{
		h += (d % 10) * offset;
		offset *= 16;
		d /= 10;
	}
	return h;
}

这两种方法都能实现转换, 但是效率不尽相同~~~
吾使用微妙级来查看两个函数消耗的时间.

	UINT64 ui64d = 12345678;
	LARGE_INTEGER litmp;
	//得到系统高分辨率时钟的频率值,每秒钟的计数器值
	::QueryPerformanceFrequency(&litmp);
	double dfFreq = DOUBLE(litmp.QuadPart );
	//开始计时
	::QueryPerformanceCounter(&litmp);
	ULONG QPartStart = ULONG(litmp.QuadPart);
	//调用字符串方式转换
	UINT64 ui64r = sD2H(ui64d);
	//结束计时
	::QueryPerformanceCounter(&litmp);
	ULONG QPartEnd = ULONG(litmp.QuadPart);
	//计算流逝的时间
	DOUBLE dfMinus = DOUBLE(QPartEnd - QPartStart);
  	//调试输出微秒进度。
	TRACE(_T("结果:%I64u, 耗时:%f\r\n"),ui64r, dfMinus);
	
	//开始计时
	::QueryPerformanceCounter(&litmp);
	QPartStart = ULONG(litmp.QuadPart);
	//调用计算方式转换
	ui64r = mD2H(ui64d);
	//结束计时
	::QueryPerformanceCounter(&litmp);
	QPartEnd = ULONG(litmp.QuadPart);
	//计算时间
	dfMinus = DOUBLE( QPartEnd - QPartStart);  //这就是微秒进度。
	//输出
	TRACE(_T("结果:%I64u, 耗时:%f\r\n"),ui64r, dfMinus);

输出结果(CE模拟器里跑得,性能略低):

	结果:305419896, 耗时:30091.000000
	结果:305419896, 耗时:3193.000000

字符串赋值果然好慢, 看来以后这种大量使用的运算还是用数学方式计算来的好.
你可能还会对下列文章感兴趣:

0条评论 你不想来一发么↓

    想说点什么呢?

    您需要登录您的Google账号才能进行评论。