我试图创建一个简单的程序来转换二进制数,例如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;
}
答案 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;
}
请注意,整个条件都是多余的 - 您可以将其从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;
}
答案 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。