码迷,mamicode.com
首页 > 其他好文 > 详细

二进制相加

时间:2015-09-05 16:21:53      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

本来是打算直接用 bitset 解决问题的,转成二进制再转成十进制,相加后再通过逆运算求得最终的字符串。

然而却存在一个问题,就是溢出,当给出的二进制过于大的时候,相加就解决不了了,因此就要按照字符串来处理。

以下是我的解决方案,虽说很丑,然而速度还行吧:

string addBinary(string a, string b) {
    string result;
    char carry        = 0;
    string* shortStrp = &a;
    string* longStrp  = &b;
    
    if (a.length() > b.length()){
        shortStrp = &b;
        longStrp  = &a;
    }
    
    auto pushFront = [&](const char* s)
    {
        result.insert(0, s);
    };
    
    auto longStrIt  = longStrp->crbegin();
    auto shortStrIt = shortStrp->crbegin();
    
    while (longStrIt != longStrp->crend()){
        if (shortStrIt == shortStrp->crend()){
            auto const sum = (*longStrIt + carry);
            if (sum == 0 + 0){
                pushFront("0");
                carry = 0;
            }
            else if (sum == 0 + 1){
                pushFront("1");
                carry = 0;
            }
            else if (sum == 1 + 1){
                pushFront("0");
                carry = 1;
            }
            ++longStrIt;
        }
        else{
            auto const sum = (*longStrIt + *shortStrIt + carry);
            if (sum == 0 + 0 + 0){
                pushFront("0");
                carry = 0;
            }
            else if (sum == 0 +0 + 1){
                pushFront("1");
                carry = 0;
            }
            else if (sum == 1 + 1 + 0){
                pushFront("0");
                carry = 1;
            }
            else if (sum == 1 + 1 + 1){
                pushFront("1");
                carry = 1;
            }
            ++longStrIt;
            ++shortStrIt;
        }
    }
    if (carry == 1){
        pushFront("1");
    }
    return result;
}

 

二进制相加

标签:

原文地址:http://www.cnblogs.com/wuOverflow/p/4783321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!