c - 十六进制 转 十进制
考虑到举一反三,这里顺便上完整代码,顺便可以考虑实现R进制和十进制的转换.
完整代码:
1 #include <stdio.h> 2 #include <math.h> 3 4 double 5 hexToDecimal(int); 6 7 double 8 octToDecimal(int); 9 10 double 11 toDecimal(int, int, int); 12 13 int 14 main(void) { 15 int a = 0x3c; 16 double r = hexToDecimal(a); 17 printf("%.f\n", r); 18 a = 017; 19 r = octToDecimal(a); 20 printf("%.f\n", r); 21 } 22 23 double 24 hexToDecimal(int hex) { 25 return toDecimal(hex, 15, 4); 26 } 27 double 28 octToDecimal(int oct){ 29 return toDecimal(oct, 7, 3); 30 } 31 32 33 double 34 toDecimal(int num, int base, int offset) { 35 int i = 0; //(b)的i次幂. 36 double r=0; //十进制结果. 37 double b= base + 1; //底数为b. 38 while(num) { 39 double t = (int)(num & base); 40 r += t * pow(b, i++); 41 num>>=offset; 42 } 43 44 return r; 45 }
该算法还是蛮简单,易懂的.例如十六进制的 3C,依次从右往左取数,通过&(与)15(4位1)可以得到C的二进制值的大小,为12.接下来就不用说了.很简单了.
另外,对于"输入"16进制,的情况:
1 /* 2 input:16进制. 3 output:10进制. 4 */ 5 int hexToDecimal(char * hex) { 6 int len = strlen(hex); //主要进行次方运算. 7 double b = 16; //底数. 8 int result = 0; //存储结果. 9 char *p = hex; 10 11 while(*p) { 12 if(*p >= '0' && *p <= '9') 13 result += (int)pow(b, --len) * (*p - '0'); 14 else if(*p >= 'a' && *p <= 'f') 15 result += (int)pow(b, --len) * (*p - 'a' + 10); 16 else if(*p >= 'A' && *p <= 'F') 17 result += (int)pow(b, --len) * (*p - 'A' + 10); 18 19 p++; 20 } //while. 21 22 return result; 23 }

浙公网安备 33010602011771号