关于the c programming language 里的一个习题(第二章)——十六进制转十进制

jwbecalm 2006-03-16 08:54:02
/*
** 编写函数htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)
转换为与之等价的整型值。字符串允许包含的数字包括:0~9,a~f以及A~F。
*/

#define YES 1
#define NO 0

/* htoi:convert hexadecimal string s to integer*/
int htoi(char s[]){
int hexdigit, i, ishex, result;

i = 0;
if(s[i] =='0'){ /*skip optional 0x or 0X*/
++i;
if(s[i] == 'x' || s[i] == 'X'){
++i;
}
}

result = 0; /*integer value to be returned*/
ishex = YES; /*asume valid hexadecimal digit*/
for(; ishex == YES; ++i){
if(s[i] >= '0' && s[i] <= '9'){
hexdigit = s[i] - '0';
}
else if(s[i] >= 'a' && s[i] <= 'f'){
hexdigit = s[i] - 'a' +10;
}
else if(s[i] >= 'A' && s[i] <= 'F'){
hexdigit = s[i] - 'A' +10;
}
else{
ishex = NO; /*not a valid hexadecimal digit*/
}
if(ishex == YES){
result = 16 * result + hexdigit;
}
}
return result;
}

main(){
char s[] = "0x5A";
printf("%d\n",htoi(s));
}


//----------------------------------------------------------------------
其中用了这么一句:
result = 16 * result + hexdigit;
请问这是怎么推导出来的?
...全文
273 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamcaicainiao 2006-03-17
  • 打赏
  • 举报
回复
不用找书啊。据个例子。

十进制的5872=5*10的三次方+8*10的二次方+7*10的一次方+2*10的零次方(十进制)。明白么?

二进制的1011=1*2的三次方+0*2的二次方+1*2的一次方+1*2的零次方(十进制)。明白么?

十六进制ba35=b*16的三次方+a*16的二次方+3*16的一次方+5*16的零次方(十进制)。明白么?
jwbecalm 2006-03-17
  • 打赏
  • 举报
回复
请问哪本书上讲得有?我去找来看看
jwbecalm 2006-03-17
  • 打赏
  • 举报
回复
我就想在不知道公式的情况下,自己推一下

现在已经清楚多了哈
jwbecalm 2006-03-17
  • 打赏
  • 举报
回复
谢谢楼上的,你说的我知道。

我考虑的主要是:
这个程序中的算法是从数组的第一位开始(最高位——存放5872的5),依次获得后面的位数,直到最后一个数(最低位2)为止。

所以程序并不知道5要*10的三次方,而是通过递推的方式,按公式逐项求和而得

比如:5872
开始result=0;
1.result = result*10 +5 =5;
2.result = result*10 +8 =58;
3.result = result*10 +7 =587;
4.result = result*10 +2 =5872;

我只是想寻找一个完整的数学推导过程,因为偶的数学不好。。。
jixingzhong 2006-03-16
  • 打赏
  • 举报
回复
0x35 = 16*3 +5 (10进制)
jixingzhong 2006-03-16
  • 打赏
  • 举报
回复
result = 16 * result + hexdigit;
请问这是怎么推导出来的?
--------------
进制转换的基本公式 ...

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧