二进制表示

 阅读约 4 分钟
给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 32 个字符之内来精确地表示,则返回 "ERROR"。
string binaryRepresentation(const string& str) {
    string integer;
    string decimal;

    auto pos = str.find_first_of('.');
    
    if (pos == string::npos) {
        integer = str;
    } else {
        integer = str.substr(0, pos);
        decimal = str.substr(pos + 1);
    }
    
    vector<int> vec(integer.size());
    
    for (int i = 0; i < vec.size(); ++i) {
        vec[i] = integer[i] - '0';
    }

    string ret;
    int idx = 0;
    while (idx < vec.size()) {
        char binary_num = ('0' + vec[vec.size() - 1] % 2);
        ret = binary_num + ret;
        for (int i = idx; i < vec.size(); ++i) {
            if (i + 1 < vec.size()) {
                vec[i + 1] += 10 * (vec[i] % 2);
            }
            vec[i] >>= 1;
        }
        if (vec[idx] == 0) {
            ++idx;
        }
    }
    bool all_zero = true;
    for (int i = 0; i < decimal.size(); ++i) {
        if (decimal[i] != '0') {
            all_zero = false;
        }
    }
    if (!all_zero && !decimal.empty()) {
        ret += '.'; 
        vec.resize(decimal.size());
        for (int i = 0; i < vec.size(); ++i) {
            vec[i] = decimal[i] - '0';
        }
        idx = vec.size() - 1;
        int bound = 32;
        while (idx >= 0) {
            for (int i = idx; i >= 0; --i) {
                vec[i] *= 2;
                if (i < idx) {
                    vec[i] += vec[i + 1] / 10;
                    vec[i + 1] %= 10;
                }
            }
            if (vec[0] >= 10) {
                vec[0] %= 10;
                ret += '1';
            } else {
                ret += '0'; 
            }
            if (vec[idx] == 0) {
                --idx;
            }
            if (--bound < 0 ) {
                return "ERROR";
            }
        }
    }
    return ret;
}
阅读 588发布于 2017-05-31

推荐阅读
shiyang6017
用户专栏

计算机

15 人关注
106 篇文章
专栏主页
目录