Chinaunix

标题: 十进制转二进制 八进制 十六进制的代码 [打印本页]

作者: bladmin    时间: 2010-07-05 20:32
标题: 十进制转二进制 八进制 十六进制的代码
  1. #include <stdio.h>
  2. #define JINZHI 16

  3. int main(){

  4.         int num = 982;
  5.         int i=0;
  6.         int res[100];
  7.         while(num>JINZHI){
  8.                 res[i] = num%JINZHI;
  9.                 num = num/JINZHI;
  10.                 i++;
  11.         }
  12.         if(num !=0){
  13.                 res[i]=num;
  14.                 i++;
  15.         }
  16.         for(i=i-1;i>=0;i--){
  17.                 if(JINZHI == 16){
  18.                         switch(res[i]){
  19.                                 case 10:
  20.                                         printf("A");
  21.                                         break;
  22.                                 case 11:
  23.                                         printf("B");
  24.                                         break;
  25.                                 case 12:
  26.                                         printf("C");
  27.                                         break;
  28.                                 case 13:
  29.                                         printf("D");
  30.                                         break;
  31.                                 case 14:
  32.                                         printf("E");
  33.                                         break;
  34.                                 case 15:
  35.                                         printf("F");
  36.                                         break;
  37.                                 default:
  38.                                         printf("%d",res[i]);
  39.                                         break;
  40.                         }
  41.                 }else
  42.                         printf("%d",res[i]);
  43.         }
  44.         printf("\n");
  45. }
复制代码
但是感觉自己写得很笨,希望大家指点迷津!!!
多谢多谢!
作者: 没本    时间: 2010-07-05 20:55
支持一下。另外建议楼主看看strtol和strtoul这两个库函数,可以把你的2进制、8进制、16进制的字符串数字转回数值型的。当然它还可以转2到36进制的任何一种进制到数值型。
作者: 没本    时间: 2010-07-05 23:40
本帖最后由 没本 于 2010-07-05 23:52 编辑

如果只是转成2,8,16进制,直接用右移就可以了,不必做除法。另外查表比case要快速。

  1. $ cat jz.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>

  5. const int DGSHIFT[] = {0,0,1,0,0,0,0,0,3,0,0,0,0,0,0,0,4};
  6. const int N2C[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

  7. int main(int argc, char ** argv)
  8. {
  9.         unsigned long num;
  10.         int i, base, digimask, digishift;
  11.         char * e, outstr[36]= {0};
  12.         if( argc<3 )
  13.         {
  14.                 perror( "Usage: jz num toBase[=2,8,16]" );
  15.                 return -1;
  16.         }

  17.         num = strtoul( argv[1], &e, 10 );
  18.         if( errno == ERANGE || (errno != 0 && num == 0) )
  19.         {
  20.                perror( "strtol" );
  21.                return -2;
  22.         }

  23.         base = atoi( argv[2] );
  24.         if( base != 2 && base != 8 && base != 16 )
  25.         {
  26.                 perror( "base" );
  27.                 return -3;
  28.         }

  29.         if( 0==num )
  30.         {
  31.                 puts( "0" );
  32.                 return 0;
  33.         }

  34.         digishift = DGSHIFT[base];
  35.         digimask = base-1;
  36.         for( i=sizeof(outstr)-2; num; i--, num>>=digishift )
  37.                 outstr[i] = N2C[ num&digimask ];
  38.         puts( outstr+i+1 );
  39.         return 0;
  40. }

  41. $ gcc jz.c -o jz
  42. $ ./jz 33 16
  43. 21
  44. $ ./jz 30 16
  45. 1E
  46. $ ./jz 30 8
  47. 36
  48. $ ./jz 30 2
  49. 11110
复制代码

作者: peidright    时间: 2010-07-05 23:43
回复 3# 没本


    {:3_191:} ,大侠,最近兴致真高,每贴必回代码 ,下次直接问你一个项目。。。。让您老给直接写出来。
作者: 没本    时间: 2010-07-05 23:51
回复 4# peidright


    3、5分钟写不出来的代码,我会放弃的,你不用问项目了,呵呵。
作者: noword2k    时间: 2010-07-06 08:47
直接用sprintf, sscanf就可以了
作者: brynx    时间: 2010-07-06 10:17
学习
作者: hellioncu    时间: 2010-07-06 11:03
如果只是转成2,8,16进制,直接用右移就可以了,不必做除法。另外查表比case要快速。
没本 发表于 2010-07-05 23:40



    还查表呀,直接 + '0'、+ 'A'估计更快
作者: zimang    时间: 2010-07-06 11:07
回复 8# hellioncu


    o
作者: 狗气球    时间: 2010-07-06 11:21
还查表呀,直接 + '0'、+ 'A'估计更快
hellioncu 发表于 2010-07-06 11:03



    这个查表快是没疑问的。因为+'0'和+'A'两种不同处理就已经有逻辑分支了。
作者: hellioncu    时间: 2010-07-06 11:23
这个查表快是没疑问的。因为+'0'和+'A'两种不同处理就已经有逻辑分支了。
狗气球 发表于 2010-07-06 11:21



    又不是有分支就肯定慢
作者: 狗气球    时间: 2010-07-06 11:25
又不是有分支就肯定慢
hellioncu 发表于 2010-07-06 11:23



    那就得看实际是啥CPU、编译器、怎么跑了。
作者: hellioncu    时间: 2010-07-06 11:50
那就得看实际是啥CPU、编译器、怎么跑了。
狗气球 发表于 2010-07-06 11:25



    我在两个系统下大概测试了下,一般还是查表快,大概1倍吧




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2