C++ 将超过64位的数组转换为10进制字符串

C++ 将超过64位的数组转换为10进制字符串,c++,string,binary-data,C++,String,Binary Data,我试图滚动我自己的任意大小的无符号整数类,但是我很难找到一种方法来转换我用来将位存储到以10为基数的字符串中的std::vector。目前,我的算法是 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

我试图滚动我自己的任意大小的无符号整数类,但是我很难找到一种方法来转换我用来将位存储到以10为基数的字符串中的std::vector。目前,我的算法是

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);
但是,由于std::to_字符串和内置无符号long的限制,这只适用于2^64以下的数字。如何将多位无符号int转换为以10为基数的转换的字符串表示形式?我希望算法可以扩展到任意位数。

伪代码:

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";
}

优化留给读者作为练习。

编辑:请不要使用此代码!糟透了!最后我用了10除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;

只需使用十进制数字的直接表示。检查二进制数字,并根据需要对十进制数字进行加法和双精度运算。std::bitset在编译时不需要预先确定的位数吗?我的类将有不同数量的位,以节省内存。是的,注意到我看错了问题。对你有用吗?@NathanOliver我想那个问题是关于二进制到十六进制,而不是二进制到十进制的问题。@quietsamurai98该死的。再次抱歉。不知道为什么我搜索了hex有两种从基A到基B的转换方法。可以使用基B来计算基A规范的值。这既简单又高效。或者,您可以使用基数A来计算基数B数字,这涉及低效的除法和复杂性。您选择了低效且复杂的方法。它是通用的,适用于任意位数。正如我所写的,优化只是一个练习……而且,像这样在字符串开头追加数据是非常昂贵的。只在末尾追加,然后反转整个字符串会更便宜。您还可以使用stringstream而不是string,这样您就不必创建带有to_string的临时string对象来将其插入结果中。而不是除以10,你可以除以10的最高幂,它适合于一个普通的整数,我想那应该是100000000,如果I/=100000000>0,用前导零填充。