在C ++中将Binary转换为Integer会返回奇怪的结果

时间:2018-06-18 20:27:18

标签: 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;

}

2 个答案:

答案 0 :(得分:3)

问题是你转换了这段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;
}

Demo 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;
}

Demo 2

答案 1 :(得分:1)

一个问题是main中的111100010对于482 base 10而言不是binary literal,但实际上是十进制值111100010.如果要使用二进制文字,则不需要任何代码,只需写出来,因为整数是一个整数,无论​​表示如何。

如果您正在尝试处理二进制字符串,则可以执行此类操作

#include <iostream>
#include <algorithm>

using namespace std;

int bin_to_int(const std::string& binary_string);

int main()
{
    cout << bin_to_int("111100010") << endl;
    cout << 0b111100010 << endl;
    return 0;
}

int bin_to_int(const std::string& bin_string){

    //Strings index from the left but bits start from the right so reverse it
    std::string binary = bin_string;
    std::reverse(binary.begin(), binary.end());

    int number_length = bin_string.size();
    //cout << "bits " << number_length << "\n";

    int number = 0;

    for(int i = 0; i <= number_length; i++){
        int bit_value = 1 << i;
        if(binary[i] == '1')
        {
            //cout << "Adding " << bit_value << "\n";
            number += bit_value;
        }
    }

    return number;
}

请注意,要使用二进制文字,您需要编译c ++ 14。