在c中使用数组将二进制转换为十进制

bbuxkriu  于 2023-02-11  发布在  其他
关注(0)|答案(3)|浏览(196)

我正在尝试将一个二进制数转换为十进制数。在我的代码中,数字将作为整数数组的成员输入,然后对每个成员进行一些数学运算,最后将结果添加到另一个变量中。我最初想将二进制数收集为字符串,然后使用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

我会很高兴如果我的错误被发现和纠正。我也将感谢优化我的代码。谢谢

vmdwslir

vmdwslir1#

就像其他人说的,你不能在函数内部计算数组的长度,长度***必须***传递给函数。
我添加了一个新参数len
在此之后,使用位移位计算值就变得非常简单了。

#include <stdio.h>

int binToint(int bits[const], int len)
{
    int answer = 0;
    for(int i=0; i<len; ++i)
    {
        answer = (answer << 1) + bits[i];
    }
    return answer;
}

int main(void) {

  int tester[] = {1,1,1,0,1,1};
  int result = binToint(tester, 6); //calling the function, including the length.
  
  printf("Result is %d\n", result);
}

输出

Result is 59
yv5phkfx

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
巧妙的技巧是,所有这些"幂"的东西都是重复的乘法,所以从最左边(最高有效位)的数字开始,然后每次乘以基数,再加上下一个数字值,就可以很容易地建立一个数字:

multiply,    add
0 * 2 =  0,  0 + [1] (first digit)  = 1
1 * 2 =  2,  2 + [0] (second digit) = 2
2 * 2 =  4,  4 + [1] (third digit)  = 5
5 * 2 = 10, 10 + [1] (fourth digit) = 11 (final answer)

当你得到一个二进制数组(01,而不是'0''1')时,你可以很容易地建立你的结果。从0开始,简单地对下一位数进行乘法和加法:

int value = 0;
for (each digit in the input array, left to right)
{
  value *= 2;
  value += digit;
}
return value;

向后(int到数组)比较复杂,只是因为您只能从右边(最低有效位)剥离数字,但除此之外还是一样简单。
祝你好运!

yquaqz18

yquaqz183#

代码有超出数组末尾的风险。

int tester[] = {1,1,1,0,1,1};
binToint(tester);

int binToint(int arrName[])

for (index = 0; arrName[index] == 1 || arrName[index] == 0; index++)

没有什么能肯定地阻止arrName[index]超过arrName[5]
代码应传入 length

int tester[] = {1,1,1,0,1,1};
int n = sizeof tester/sizeof tester[0];
binToint(n, tester);

然后迭代:

int binToint(int n, int arrName[]) {
  ...
  for (index = 0; index < n; index++)

初始化错误

仅初始化了x

// int length, j, x = 0;
int length = 0;
int j = 0;
int x = 0;

无溢出检测

健壮的代码会抱怨试图形成一个大于INT_MAX的值。

代码也可能存在其他问题

相关问题