c语言中二进制转十进制详解

1.字符与字符代码

字符与字符代码并不是任意写一个字符,程序都能识别的。例如代码圆周率的π在程序中是不能被识别的,只能使用系统的字符集中的字符,目前大多数系统采用ASCII字符集。                              数字字符‘1’的ASCII代码是十进制数49,二进制形式是0110001。其中我们需要知道的是‘1’和1是不同的概念。字符‘1’只是表示一个形状为‘1’的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占一个字节;整数则是以整数的方式存储,占2个或4个字节。整数1+1=2,而字符‘1’+‘1’并不等于整数2或字符‘2’。

 2.二进制转十进制

#include<stdio.h>
#pragma warning(disable:4996)
#define N 16
int fun(char s[])
{
    int i,sum=0;
    for(i=0;s[i]!='\0'&&i<N;i++)
        sum=2*sum+(s[i]-48);       //这里的48等价于'0'
        return sum;
}
int main()
{
    char num[]="10011";
    int n;
    n=fun(num);
    printf("%s-->%d\n",num,n);
}

3.程序分析

其实这个程序的核心就是  sum=2*sum+(s[i]-48);  这个算法是比较巧妙的,我们一步一步来解剖。前面我们提到了字符运算并不像整数运算,那这里我们首先需要把存放在数组里的字符转化成整数也就是s[i]-48。那么2*sum又是怎么来的呢?其实本质还是由二进制转十进制的算法得来。我们可以举个例子

X1+X2*2^1+X3*2^2+X4*2^3+X5*2^4

=X1+2(X2+2(X3+2(X4+2X5)                                                                                                              这样我们就把他们转化成2*sum的形式了也就等价于sum=2*sum+i(这里是从高位也就是从左至右开始读取)当sum=0时这里的i等于x5,接下来就是一个累加的过程了,最终的sum就是二进制转化为十进制的数值。

4.总结

其实我自己也想了一些时间,还是基础不够扎实,用到了字符、ASCII码和累加等等,也告诫我们更有技巧性的东西其实都是从本质推算出来的,还是那句老话,万变不离其宗。

 

 

  • 20
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ferry_24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值