网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月24日漏签0天
图形编程forc吧 关注:14贴子:296
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 0回复贴,共1页
<<返回图形编程forc吧
>0< 加载中...

数字转16进制字符串的五种写法与速度对比

  • 只看楼主
  • 收藏

  • 回复
  • hellovfp
  • 排序查找
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include "random.h"
static char tab[] = "0123456789abcdef";
char * toh(char *p, int val)
{
if(val > 0){
p = toh(p, val >> 4);
*p++ = tab[val & 0xf];
}
return p;
}
// 递归写法
void tohex1(char *buf, int val)
{
char *p = toh(buf, val);
if(p == buf) *p++ = '0';
*p = 0;
}
// 位移写法
void tohex2(char *s, int val)
{
int i = 28;
//for(; i>0 && ((val>>i) & 0xf) == 0; i-=4);
for(; i >=0; i-=4)
*s++ = tab[(val>>i) & 0xf];
*s = 0;
}
// 位移写法的改进版
void tohex3(char *s, int val)
{
for(int i = 3; i >=0; --i){
int t = val >>(i << 3);
*s++ = tab[(t>>4)& 0xf];
*s++ = tab[t& 0xf];
}
*s = 0;
}
// 常见写法,使用反转
void tohex4(char *s, int val)
{
char *p = s;
do{
*s++ = tab[val&0xf];
}while(val >>=4);
*s = 0;
while(p<s-1){//反转
char t = *p;
*p++ = *--s;
*s = t;
}
}
union Hex
{
char c[4];
int val;
};
// 联合直接转换法
void tohex5(char *s, int val)
{
Hex h;
h.val = val;
*s++ = tab[(h.c[3]>>4)&0xf];
*s++ = tab[h.c[3] & 0xf];
*s++ = tab[(h.c[2]>>4)&0xf];
*s++ = tab[h.c[2] & 0xf];
*s++ = tab[(h.c[1]>>4)&0xf];
*s++ = tab[h.c[1] & 0xf];
*s++ = tab[(h.c[0]>>4)&0xf];
*s++ = tab[h.c[0] & 0xf];
*s = 0;
}
//测试代码:
int main()
{
char buf[5][10];
int i, val = 0x1234bcde, N = 10000000;
double time1;
Clock.start();
for(i = 0; i < N; ++i)
tohex1(buf[0], val);
time1=Clock.elapse();
printf("hex1 :%.3f\n", time1);
Clock.start();
for(i = 0; i < N; ++i)
tohex2(buf[1], val);
time1=Clock.elapse();
printf("hex2 :%.3f\n", time1);
Clock.start();
for(i = 0; i < N; ++i)
tohex3(buf[2], val);
time1=Clock.elapse();
printf("hex3 :%.3f\n", time1);
Clock.start();
for(i = 0; i < N; ++i)
tohex4(buf[3], val);
time1=Clock.elapse();
printf("hex4 :%.3f\n", time1);
Clock.start();
for(i = 0; i < N; ++i)
tohex5(buf[4], val);
time1=Clock.elapse();
printf("hex5 :%.3f\n", time1);
puts(buf[0]);
puts(buf[1]);
puts(buf[2]);
puts(buf[3]);
puts(buf[4]);
}
运行结果:

由此可见,递归写法最慢,有趣的是算法3, 循环次数减半,用时也会减半,算法5由于没有循环,所以速度居然达到最快,这种将循环展开为直接代码输出,可有效提升代码运行速度,这种方式在阅读mpg123的原代码也经看到。算法2-5适合不同的应用场景,记录于此,仅供参考。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 0回复贴,共1页
<<返回图形编程forc吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示