c - 十六进制 转 十进制

时间:2021-12-16 21:35:36

考虑到举一反三,这里顺便上完整代码,顺便可以考虑实现R进制和十进制的转换.

完整代码:

 #include <stdio.h>
#include <math.h> double
hexToDecimal(int); double
octToDecimal(int); double
toDecimal(int, int, int); int
main(void) {
int a = 0x3c;
double r = hexToDecimal(a);
printf("%.f\n", r);
a = ;
r = octToDecimal(a);
printf("%.f\n", r);
} double
hexToDecimal(int hex) {
return toDecimal(hex, , );
}
double
octToDecimal(int oct){
return toDecimal(oct, , );
} double
toDecimal(int num, int base, int offset) {
int i = ; //(b)的i次幂.
double r=; //十进制结果.
double b= base + ; //底数为b.
while(num) {
double t = (int)(num & base);
r += t * pow(b, i++);
num>>=offset;
} return r;
}

该算法还是蛮简单,易懂的.例如十六进制的 3C,依次从右往左取数,通过&(与)15(4位1)可以得到C的二进制值的大小,为12.接下来就不用说了.很简单了.

另外,对于"输入"16进制,的情况:

 /*
input:16进制.
output:10进制.
*/
int hexToDecimal(char * hex) {
int len = strlen(hex); //主要进行次方运算.
double b = ; //底数.
int result = ; //存储结果.
char *p = hex; while(*p) {
if(*p >= '' && *p <= '')
result += (int)pow(b, --len) * (*p - '');
else if(*p >= 'a' && *p <= 'f')
result += (int)pow(b, --len) * (*p - 'a' + );
else if(*p >= 'A' && *p <= 'F')
result += (int)pow(b, --len) * (*p - 'A' + ); p++;
} //while. return result;
}