将超过64位的数组转换为基数为10的字符串

时间:2017-09-27 18:24:04

标签: c++ string binary-data

我正在尝试滚动我自己的任意大小的无符号整数类,但我找不到转换std::vector<bool>的方法,我用来将这些位存储到基数为10的字符串中。目前,我的算法是

unsigned long long sum = 0LL;
for(unsigned long long i=0; i<64LL && i<bit_list.size(); i++){
    if(bit_list[i]){
        sum |= 1LL << i;
    }
}
return std::to_string(sum);

但是,这仅适用于低于2 ^ 64的数字,因为std::to_string和内置unsigned long long的限制。我如何将多位无符号整数转换为基数为10的转换的字符串表示?最好,我希望算法可以扩展到任意数量的位。

2 个答案:

答案 0 :(得分:1)

伪代码:

string s;
your_bitlist_class i;
if ( i > 0 )
{
    while ( i > 0 )
    {
        s.insert( 0, std::to_string( i % 10 ) );
        i /= 10;   
    }
}
else
{
    s = "0";
}

优化留给读者练习。

答案 1 :(得分:0)

编辑:请不要使用此代码!太糟糕了!我最终使用二进制除法10和余数。

这里我发现的算法效果很好。它不是超级高效的,但它完成了工作。

BigInt num_copy(this);
std::vector<unsigned short> digits;
digits.push_back(0);
while(num_copy!=0){
    num_copy--;
    digits[0]++;
    unsigned long long i = 0LL;
    while(digits[i]==10){
        if(digits.size()==(i+1LL)){
            digits.push_back(0);
        }
        digits[i]=0;
        i++;
        digits[i]++;
    }
}
std::string outstr = "";
for(unsigned long long i=0LL; i < digits.size(); i++){
    outstr = std::to_string(digits[i]) + outstr;
}
return outstr;