LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 941|回复: 10

[讨论]转换十进制数至字符串算法

[复制链接]
发表于 2007-3-20 16:31:11 | 显示全部楼层 |阅读模式
转换十进制数至字符串算法,有没有比较高效的呢?
先放出APACHE库的
00374 APR_DECLARE(char *) apr_ltoa(apr_pool_t *p, long n)
00375 {
00376     const int BUFFER_SIZE = sizeof(long) * 3 + 2;
00377     char *buf = apr_palloc(p, BUFFER_SIZE); //分配内存至内存池pool中
00378     char *start = buf + BUFFER_SIZE - 1;
00379     int negative;
00380     if (n < 0) {
00381         negative = 1;
00382         n = -n;
00383     }
00384     else {
00385         negative = 0;
00386     }
00387     *start = 0;
00388     do {
00389         *--start = (char)('0' + (n % 10));
00390         n /= 10;
00391     } while (n);
00392     if (negative) {
00393         *--start = '-';
00394     }
00395     return start;
00396 }
发表于 2007-3-20 16:47:29 | 显示全部楼层
sprintf(buf, "%d", num);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-20 20:30:50 | 显示全部楼层
sprintf 内部加线程锁的没?另外我可能要转的是64位的
sprintf(buf, "%ld", num);
回复 支持 反对

使用道具 举报

发表于 2007-3-22 09:45:14 | 显示全部楼层
sprintf是线程安全的(这里没啥全局变量需要设的吧),当然你要在不同线程里往同一个buffer里输出当然是不行的。
64位的要自己写,思路和APACHE库的实现一样。再想高效就用汇编吧,算法上实在没什么好说的了。
回复 支持 反对

使用道具 举报

发表于 2007-3-22 09:49:59 | 显示全部楼层
Post by njkzkj
sprintf 内部加线程锁的没?另外我可能要转的是64位的
sprintf(buf, "%ld", num);
即使sprintf()没有加锁,你也可以使用自旋锁或者信号量为其加锁啊!
回复 支持 反对

使用道具 举报

发表于 2007-3-25 20:45:57 | 显示全部楼层
有阿 我自己写的 用位操作   详见 下面连接 http://swpm.blog.com.cn/archives/2006/1997934.shtml
回复 支持 反对

使用道具 举报

发表于 2007-3-25 20:47:54 | 显示全部楼层
Post by biosxjj
有阿 我自己写的 用位操作   详见 下面连接 http://swpm.blog.com.cn/archives/2006/1997934.shtml

希望大家去我的bllog灌水  我把代码贴过来
#i nclude<iostream>
using namespace std;

void convertb (unsigned int a,char p[]) {
char* q=p;

      unsigned int t=0x80000000;
   for (int i=0;i<32;i++)
   {
      if((t&a)==0)
    *q='0';
   else
    *q='1';
     q++;
     a=a<<1;
   }

      

}

void convertb ( int a,char p[]) {
char* q=p;

        

     int t=0x80000000;
  if(a<0) { *q='-';q++;
  a=abs(a);}
  a<<=1;
   for (int i=0;i<31;i++)
   {
      if((t&a)==0)
    *q='0';
   else
    *q='1';
     q++;
     a=a<<1;
   }

      

}








void convert9( int a,char p[]){
  char* q=p;   
int index=39;
if(a<0) {a=abs(a);
*q='-';}
while(a!=0){
q[index]=a%9+'0';
   index--;
   if(index<=0) break;
   a/=9;
  

}





}
int main(){

char p[32];
::memset(p,0,32);
char d[32];
::memset(d,0,32);
convertb((unsigned int)3222,p);
convertb(-3222,d);
int  flag=0;
for (int i=0;i<32;i++)
{
   if(p=='1') flag++;
if(flag>0)
cout<<p;}
cout<<endl;
flag=0;
for (int i=0;i<32;i++){
if(d=='-') cout<<d;
  if(d=='1') flag++;
if(flag>0)
cout<<d;
}
cout<<endl;



char pp[40];
::memset(pp,0,40);

convert9(  ( int) -19,pp);
int flag1=0;
if(*pp=='-')
cout<<*pp;
for(int i=1;i<40;i++)
{ if(pp!=0) flag1++;
   if(flag1)
    cout<<pp;}
cout<<endl;
system("AUSE");
return 0;
}
回复 支持 反对

使用道具 举报

发表于 2007-3-25 20:49:28 | 显示全部楼层
看错了是字符串阿 ...........
强制类型转换~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2007-3-25 23:49:44 | 显示全部楼层
Post by biosxjj
希望大家去我的bllog灌水  我把代码贴过来
#i nclude<iostream>
using namespace std;

void convertb (unsigned int a,char p[]) {
char* q=p;

      unsigned int t=0x80000000;
   for (int i=0;i<32;i++)
   {
      if((t&a)==0)
    *q='0';
   else
    *q='1';
     q++;
     a=a<<1;
   }
}

没仔细看你的代码,提个建议:不要假设 int 有32位宽,现在64位的系统已经很流行了。
为了移植,建议将代码中的32改为 sizeof(int) * 8,将 0x80000000 改为 1<<(sizeof(int)*8)。
回复 支持 反对

使用道具 举报

发表于 2007-3-26 15:02:26 | 显示全部楼层
楼上的兄弟说得有道理 受用了~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表