首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

二进制转换为十进制函数!

2012-03-14 
二进制转换为十进制函数求助!!在网上找到这样一个程序,可是中间注释的地方看不懂,求大侠指导。main(){ char

二进制转换为十进制函数求助!!
在网上找到这样一个程序,可是中间注释的地方看不懂,求大侠指导。
main() 
{ char *p,s[6];int n; /*为什么要定义个指针还要定义数组*/
p=s; 
gets(p); 
n=0; 
while(*(p)!='\0') 
{
n=n*2+*p-'0'; /*这个地方为什么是这个,这个算法看不懂啊*/
p++;

printf("%d\n",n); 
}

[解决办法]
n=n*2+*p-'0'
手工转换时你是怎么做的,好好想想。
[解决办法]

C/C++ code
main()  { char *p,s[6];int n; /*数组s是用来储存输入的二进制数,p指针用于指示数组内的字符*/p=s;  gets(p);  n=0;  while(*(p)!='\0')  {n=n*2+*p-'0'; /*这里相当于一元多项式求和*/p++;}  printf("%d\n",n);  }
[解决办法]
来晚了....

为什么要定义个指针还要定义数组

指针要指向一个地址,否则,他的地址未知,gets到的数据放到了未知的地方,是非法操作。

这个地方为什么是这个,这个算法看不懂啊

这个是哪个,我不知道。
单步调试,看每次循环n的值就能明白了。
比如 字符串111 转 十进制
第一次 n1 = 1
第二次 n2 = 3 = n1 * 2 + 1 
第三次 n3 = 7 = n2 * 2 + 1

[解决办法]
探讨
来晚了....

为什么要定义个指针还要定义数组

指针要指向一个地址,否则,他的地址未知,gets到的数据放到了未知的地方,是非法操作。

这个地方为什么是这个,这个算法看不懂啊

这个是哪个,我不知道。
单步调试,看每次循环n的值就能明白了。
比如 字符串111 转 十进制
第一次 n1 = 1
第二次 n2 = 3 = n1 * 2 + 1
第三次 n3 = 7 ……

[解决办法]
你的式子可以转成(((a6*2+a5)*2+a4)*2+a3)*2...........
*p-'\0'就是在求a[n]

[解决办法]
上面的算法是由二进制位的从高位向低位开始计算和 。
n=n*2+*p-'0' //n 代表当前位的和,计算下一位时,需要考虑进制的差别。你可以自己比划下。
 
相对而言,容易理解的是 由二进制位的从低位向高位开始计算和 。简易算法如下:
C/C++ code
p = s+5 ; //指向字符串最低位            int n =0 ;            int i=0 ; //计算当前是第几位            while(p>=s)           {              n= n + *p * i              i++;            }
[解决办法]
你先看哈十进制由数组最低位求和的例子,从最低位求只是没有从最高位求直观而已(因为数组最低位对应十进制数最高位),其实都是当前数乘以进制的权数次方累加的。任何进制的都是这样。觉得不好理解可以先用k(当前数) *pow(2,权数)累加吧。手机也不好贴代码了。然后定义一个指针是为了便于操作(地址自增),数组名是一个常量地址,不能进行改变。
[解决办法]
LS各位正解、
定义个指针 p 的作用是后面能用 p++ 运算 数组名不能 s++ 只能用循环取值

热点排行