我正在尝试将一个二进制数转换为十进制数。在我的代码中,数字将作为整数数组的成员输入,然后对每个成员进行一些数学运算,最后将结果添加到另一个变量中。我最初想将二进制数收集为字符串,然后使用atoi或strol将其转换为整数数组,但我做不到,所以我尝试了这种方法。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int binToint(int arrName[]);
int binToint(int arrName[]) {
int index;
int length, j, x = 0; //initializing length, x and j to 0
for (index = 0; arrName[index] == 1 || arrName[index] == 0; index++)
++length;
j = length;
for (index = 0; index < length; index++) {
--j;
if (j < 0)
break;
x += arrName[index] * ((int)pow(10, j)); //decimal = binary x 10^index of digit
}
printf("Result: %d", x);
return x;
}
int main(void) {
int tester[] = {1,1,1,0,1,1}; //i used the commas so that each digit will be stored separately
binToint(tester); //calling the function
}
运行后,我没有得到任何输出,而是得到了一个空屏幕。输出应该是:
Result: 59
我会很高兴如果我的错误被发现和纠正。我也将感谢优化我的代码。谢谢
3条答案
按热度按时间vmdwslir1#
就像其他人说的,你不能在函数内部计算数组的长度,长度***必须***传递给函数。
我添加了一个新参数
len
。在此之后,使用位移位计算值就变得非常简单了。
输出
yv5phkfx2#
记住,* any * 数字只是一个多项式的系数,对应于基数(或基数)的每一次幂,即:
3
× 102 +0
× 101 +7
× 100 == x一个三个一个x一个四个一个x一个五个一个 ==307
对于 * binary *,基数不是10,而是2。因此:
x1米7个1 x 1米8个1 x 1米9个1 x 1米10个1 x 2 == x 1米11纳米1 x × 23 + x 1米12纳米1 x × 22 + x 1米13纳米1 x × 21 + x 1米14纳米1 x × 20
⟶ 八加零加二加一 == 1110
巧妙的技巧是,所有这些"幂"的东西都是重复的乘法,所以从最左边(最高有效位)的数字开始,然后每次乘以基数,再加上下一个数字值,就可以很容易地建立一个数字:
当你得到一个二进制数组(
0
或1
,而不是'0'
或'1'
)时,你可以很容易地建立你的结果。从0
开始,简单地对下一位数进行乘法和加法:向后(
int
到数组)比较复杂,只是因为您只能从右边(最低有效位)剥离数字,但除此之外还是一样简单。祝你好运!
yquaqz183#
代码有超出数组末尾的风险。
与
而
int binToint(int arrName[])
没有什么能肯定地阻止
arrName[index]
超过arrName[5]
。代码应传入 length。
然后迭代:
初始化错误
仅初始化了
x
。无溢出检测
健壮的代码会抱怨试图形成一个大于
INT_MAX
的值。代码也可能存在其他问题