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 }

 

posted @ 2014-09-12 00:49  wonkju  阅读(1293)  评论(0)    收藏  举报