- 论坛徽章:
- 0
|
本帖最后由 没本 于 2010-07-05 23:52 编辑
如果只是转成2,8,16进制,直接用右移就可以了,不必做除法。另外查表比case要快速。
- $ cat jz.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- const int DGSHIFT[] = {0,0,1,0,0,0,0,0,3,0,0,0,0,0,0,0,4};
- const int N2C[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
- int main(int argc, char ** argv)
- {
- unsigned long num;
- int i, base, digimask, digishift;
- char * e, outstr[36]= {0};
- if( argc<3 )
- {
- perror( "Usage: jz num toBase[=2,8,16]" );
- return -1;
- }
- num = strtoul( argv[1], &e, 10 );
- if( errno == ERANGE || (errno != 0 && num == 0) )
- {
- perror( "strtol" );
- return -2;
- }
- base = atoi( argv[2] );
- if( base != 2 && base != 8 && base != 16 )
- {
- perror( "base" );
- return -3;
- }
- if( 0==num )
- {
- puts( "0" );
- return 0;
- }
- digishift = DGSHIFT[base];
- digimask = base-1;
- for( i=sizeof(outstr)-2; num; i--, num>>=digishift )
- outstr[i] = N2C[ num&digimask ];
- puts( outstr+i+1 );
- return 0;
- }
- $ gcc jz.c -o jz
- $ ./jz 33 16
- 21
- $ ./jz 30 16
- 1E
- $ ./jz 30 8
- 36
- $ ./jz 30 2
- 11110
复制代码 |
|