首页 > 解决方案 > 在 C++ 中将二进制转换为整数会返回奇怪的结果

问题描述

我正在尝试创建一个简单的程序来将二进制数转换为111100010十进制数482。我在 Python 中也做过同样的事情,它可以工作,但我在 C++ 中找不到我做错了什么。

当我执行 C++ 程序时,我得到-320505788. 我做错了什么?

这是 Python 代码:

def digit_count(bit_number):
  found = False
  count = 0

  while not found:
    division = bit_number / (10 ** count)

    if division < 1:
      found = True
    else:
      count += 1

  return count

def bin_to_number(bit_number):
  digits = digit_count(bit_number)
  number = 0

  for i in range(digits):
    exp = 10 ** i

    if exp < 10:
      digit = int(bit_number % 10)
      digit = digit * (2 ** i)
      number += digit

    else:
      digit = int(bit_number / exp % 10)
      digit = digit * (2 ** i)
      number += digit

  print(number)
  return number

bin_to_convert = 111100010
bin_to_number(bin_to_convert)

# returns 482

这是 C++ 代码:

#include <iostream>
#include <cmath>

using namespace std;

int int_length(int bin_number);
int bin_to_int(int bin_number);

int main()
{

    cout << bin_to_int(111100010) << endl;
    return 0;
}

int int_length(int bin_number){
    bool found = false;
    int digit_count = 0;

    while(!found){
        int division = bin_number / pow(10, digit_count);
        if(division < 1){
            found = true;
        }
        else{
            digit_count++;
        }
    }
    return digit_count;
}

int bin_to_int(int bin_number){
    int number_length = int_length(bin_number);

    int number = 0;

    for(int i = 0; i < number_length; i++){
        int e = pow(10, i);
        int digit;

        if(e < 10){
            digit = bin_number % 10;
            digit = digit * pow(2, i);
            number = number + digit;
        }
        else{
            if((e % 10) == 0){
                digit = 0;
            }
            else{
                digit = bin_number / (e % 10);
            }
            digit = digit * pow(2, i);
            number = number + digit;
        }
    }

    return number;

}

标签: c++

解决方案


问题是您转换了这段 Python 代码

else:
  digit = int(bit_number / exp % 10)
  digit = digit * (2 ** i)
  number += digit

进入这个:

else{
    if((e % 10) == 0){
        digit = 0;
    }
    else{
        digit = bin_number / (e % 10);
    }
    digit = digit * pow(2, i);
    number = number + digit;
}

换句话说,您是在申请/ 尝试申请%,并在此过程中防止被零除。

这是不正确的:您应该反过来应用它们,如下所示:

else{
    digit = (bit_number / e) % 10;
    digit = digit * pow(2, i);
    number = number + digit;
}

演示 1

请注意,整个条件是多余的 - 您可以将其从for循环中删除:

for(int i = 0; i < number_length; i++){
    int e = pow(10, i);
    int digit = (bit_number / e) % 10;
    digit = digit * pow(2, i);
    number = number + digit;
}

演示 2


推荐阅读