二进制转换器,为什么我必须总是除以49得到正确的答案+ cout模糊?

时间:2014-02-02 04:32:25

标签: c++ visual-c++

我最近开始学习C ++,很抱歉,如果我犯了一个愚蠢的错误...为什么我必须除以49来获得正确的答案。例如,如果我输入“1111”,则答案是735而不是15.所有数字都会发生这种情况,例如,如果我输入“10”,则答案是98而不是2.同样,为什么我的cout显示为含糊不清?即时通讯使用visual studio 2013.(请注意,除了49的除法发生在最后一行)

void binaryToDecimal() {
string number = getNumber();
int sum = 0;
int factor = 1;
for (int i = number.length() - 1; i >= 0; i--) {
    if (number.at(i) != '0' && number.at(i) != '1') {
        cout << "Number is not in binary form" << endl;
        system("pause");
        exit(1);
    }
    if (number.at(i) == '1') {
        sum += number.at(i) * factor;
    }
    factor *= 2;
}
cout << "\'" << number << "\' in binary is \'" << sum / 49 << "\'" << endl;
}

2 个答案:

答案 0 :(得分:5)

string s中的字符存储在内部与int s不同。希望这个小代码片段可以帮助您更好地理解幻数。

#include <iostream>
#include <string>

using namespace std;

int main(void){

    std::string test("1234");
    for(size_t i = 0; i < test.size(); i++){
        std::cout << static_cast<int>(test.at(i)) << std::endl;
    }

    return 0;
}

这个输出是:

49
50
51
52

请特别注意,将字符串“1”转换为int的值为49。

为了避免这种神奇的数字方法,你可能想要做两件事之一:

使用字符串进行int转换,如boost::lexical_cast或'stringstream`,首先将字符串转换为整数表示,然后处理。但是,这会改变逻辑,因为您现在正在使用一些不同的数学。

或者如果你想保持逻辑基本相同,那么最简单的事情就是在你通过输入阶段后不要在内部处理char

using namespace std;

bool binaryToDecimal() {
    string raw_input("101");//This would be your get_number function
    int sum = 0;
    int factor = 1;
    for (size_t i = raw_input.length()-1; i > 0; i--) { //I think you also had an off by one error here
        if (raw_input.at(i) != '0' && raw_input.at(i) != '1') {
            cout << "Number is not in binary form" << endl;
            return false;
        }
        if (raw_input.at(i) == '1') {
            sum += factor; //Previously you had a completely unnecessary number.at(i) in here
        }
        factor *= 2;
    }
    cout << "\'" << raw_input << "\' in binary is \'" << sum << "\'" << endl; //No more magic number required now!
    return true;
}

答案 1 :(得分:1)

ASCII中的数字被分配到代码点0x30-0x39(或48-57)。当您将某些内容乘以'1'时,结果总是包含结果中的'1'项,即49.您需要通过减去{'0''1'转换为整数值来自角色的{1}}

另外,不需要乘法,只需从左到右读取字符串并移位,就会快得多