免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6633 | 回复: 12
打印 上一主题 下一主题

十进制转二进制 八进制 十六进制的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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. }
复制代码
但是感觉自己写得很笨,希望大家指点迷津!!!
多谢多谢!

论坛徽章:
0
2 [报告]
发表于 2010-07-05 20:55 |只看该作者
支持一下。另外建议楼主看看strtol和strtoul这两个库函数,可以把你的2进制、8进制、16进制的字符串数字转回数值型的。当然它还可以转2到36进制的任何一种进制到数值型。

论坛徽章:
0
3 [报告]
发表于 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
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-07-05 23:43 |只看该作者
回复 3# 没本


    {:3_191:} ,大侠,最近兴致真高,每贴必回代码 ,下次直接问你一个项目。。。。让您老给直接写出来。

论坛徽章:
0
5 [报告]
发表于 2010-07-05 23:51 |只看该作者
回复 4# peidright


    3、5分钟写不出来的代码,我会放弃的,你不用问项目了,呵呵。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
6 [报告]
发表于 2010-07-06 08:47 |只看该作者
直接用sprintf, sscanf就可以了

论坛徽章:
0
7 [报告]
发表于 2010-07-06 10:17 |只看该作者
学习

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2010-07-06 11:03 |只看该作者
如果只是转成2,8,16进制,直接用右移就可以了,不必做除法。另外查表比case要快速。
没本 发表于 2010-07-05 23:40



    还查表呀,直接 + '0'、+ 'A'估计更快

论坛徽章:
0
9 [报告]
发表于 2010-07-06 11:07 |只看该作者
回复 8# hellioncu


    o

论坛徽章:
0
10 [报告]
发表于 2010-07-06 11:21 |只看该作者
还查表呀,直接 + '0'、+ 'A'估计更快
hellioncu 发表于 2010-07-06 11:03



    这个查表快是没疑问的。因为+'0'和+'A'两种不同处理就已经有逻辑分支了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP