50分求解这个关于二进制转换成十进制的C语言问题(30行代码)有高手???? 50

#include<stdio.h>#include<string.h>#defineN8intconvert(char*);intmain(void){charstr[N... #include <stdio.h>
#include <string.h>
#define N 8
int convert(char *);
int main(void)
{
char str[N+1];
int num;

printf("Please input a sequence of 8-binary digits:\n");
gets(str);
num=convert(str);
printf("The binary is equivalent to a %d.\n",num);
}
int convert(char *str)
{
int i=0;
int interger;
int tot=0;
int mask=0x01;

interger=atoi(str);

for(i=N-1;i>0;i--,mask<<=1)
{
tot+=(interger&mask);
}
return tot;
}

首先这个程序中,我输入一个8位的二进制,之后将这8位的二进制转换成十进制,不过结果很奇怪,例如我输入01001001,结果竟然输出41,我调试了一下,发现i=2时,mask=32,即00100000,而interger是01001001,那两个相与应该为0才对,结果tot+上了32,为什么???求解释?
展开
 我来答
jefferyang123
2013-10-18 · TA获得超过707个赞
知道小有建树答主
回答量:124
采纳率:0%
帮助的人:140万
展开全部

你已经把str用atoi转换成整数1001001了,这个是十进制的,然后你又用这个十进制的整数interger与二进制的mask做与运算,当然错了


convert函数改成如下形式就可以实现你的功能

int convert(char *str)
{
int tot=0;
 
while(*str!='\0')
{
tot=tot*2+*str-'0';
str++;
}
    
return tot;
}
更多追问追答
追问
明白了,我看了一下答案,也是这样写,验证了一下确实可行,不过我不明白为什么这段代码为什么可以转换成十进制?能解释一下吗?
追答
在手动计算二进制转十进制时,你是将每一位都乘以2的对应次方,比如字符串1011,将最高位0乘以2^3,第三位0乘以2^2,第二位1乘以2^1,第一位1乘以2^0,然后把这些和加起来1*2^3+0*2^2+1*2^1+1*2^0,现在我给出的方法是按步骤计算就是(((0*2+1)*2+0)*2+1)*2+1;这个式子和手动计算的方法是一样的,最高位1也是乘以了2^3,可能表述的不是很清楚,能看懂最好。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
军天下wolfer
2013-10-18 · TA获得超过2081个赞
知道小有建树答主
回答量:734
采纳率:100%
帮助的人:1011万
展开全部
#include <stdio.h>
#include <string.h>
#define N 8
int convert(char *);
int main(void)
{  
    char str[N+1];
    int num;
    
    printf("Please input a sequence of 8-binary digits:\n");
    gets(str);
    num=convert(str);
    printf("The binary is equivalent to a %d.\n",num);
}
int convert(char *str)
{
int i=0;
int j=1;
int tot=0;
int mask=0x01;
    
for(i=N-1;i>=0;i--,j<<=1)
{
tot+=((str[i]-'0')&mask)*j;
// 各位乘以2的j次方
}
return tot;
}

 有问题欢迎交流哈。

追问

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小白范
2013-10-18 · TA获得超过358个赞
知道小有建树答主
回答量:309
采纳率:50%
帮助的人:305万
展开全部
interger=atoi(str)=atoi(“01001001”)=1001001
这是十进制,你把它换成十六进制看看!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友fe6238841
2013-10-18 · TA获得超过2025个赞
知道小有建树答主
回答量:4233
采纳率:25%
帮助的人:552万
展开全部
你的理解错在了interger=01001001是十进制的,不是二进制数,所以不会是0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
o00olwjo00o
2013-10-18 · 超过13用户采纳过TA的回答
知道答主
回答量:50
采纳率:100%
帮助的人:29.9万
展开全部
你所输入的01001001是转化成了一个十进制的数,1001001=(11110100011000101001)B,后8位为00101001,这也就是为什么你会出现32的原因,你&出来就会是32+8+1,其实你完全可以每次%10取余,然后乘以当前的权值,累加,再做/10的操作,最后得到10进制数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式