具有Char数组的二进制到十进制转换器

时间:2013-09-30 21:19:12

标签: c++ gcc

创建二进制到十进制转换器;有大部分裸骨下来,但我有一个问题 - 程序从左到右而不是从右到左读取二进制数(正如通常通过手写计算它)。因此,诸如' 1111',' 10001'和10101'等输入作为正确的小数答案出现,但有些输入如' 10011&# 39;显然会出错。

TL; DR哪种方式最适合翻转循环如何通过char数组?

示例代码:

for (i = 0; i < 33 && binary[i] != '\0'; i++, power++)
{
  if (binary[i] == '0')
    continue;

  else if (binary[i] == '1')
    decimal = pow (2,power) + decimal;

  else
  {
  cout << "Invalid input." << endl;
  return 0;
  }
}

3 个答案:

答案 0 :(得分:0)

您可以使用以下内容从头到尾读取数组,

int pos_of_zero = strlen(binary);

for(int i = pos_of_zero - 1; i > -1;  --i, power++)
{
   // ....

答案 1 :(得分:0)

从您上面编写的代码中可以看出,您的字符串将正好是33位,或者如果它更短,它将被终止。我只是问,因为这有点奇怪,如果(例如)你可以使它总是空终止会更好。这样可以简化代码。

但如果是这样,那么以下代码应该可以工作

// find the number of digits
int num_digits = 0;
while (num_digits < 33 && binary[num_digits] != '\0')
    ++num_digits;

// now we have the number of digits we can ...
// ... loop backwards through the string
for (int i = num_digits; i > 0; )
{
    --i;
    if (binary[i] == '0')
        continue;

    else if (binary[i] == '1')
        decimal = pow (2,power) + decimal;

    else
    {
        cout << "Invalid input." << endl;
        return 0;
    }
}

我看到你收到的其他答案都假设你的字符串总是以空值终止。如果那是真的那么你应该选择其中一个答案。

答案 2 :(得分:0)

您可以执行以下操作

for (i = strlen(binary) - 1; i >= 0; --i) {

}

以这种方式,如果您有二进制数“10011”,for循环将按此顺序遍历位:1 - &gt; 1 - &gt; 0 - &gt; 0 - &gt; 1。

您可以通过避免调用pow函数,以更有效的方式计算二进制数的十进制值。

for (int i = 0, decimal = 0; i < strlen(binary); ++i)
    decimal = decimal*2 + (binary[i] - '0');