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]!=''&&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-->%dn",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码和累加等等,也告诫我们更有技巧性的东西其实都是从本质推算出来的,还是那句老话,万变不离其宗。

 

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>