C++ 如何将大整数转换为以2^32为基数的整数?

C++ 如何将大整数转换为以2^32为基数的整数?,c++,largenumber,C++,Largenumber,首先,我这样做是为了我自己,所以请不要建议“使用GMP/xint/bignum”(如果它适用的话) 我正在寻找一种将大整数(比如,超过9000位)转换为232表示的int32数组的方法。数字将以10为基数字符串开始 例如,如果我想将字符串a=“4294967300”(在基数10中)转换为新的基数232数组,它将是int32\u t b[]={1,5}。如果int32_t b[]={32485738},则基数10将是3*2^32+2485738。很明显,我将使用的数字超出了偶数int64的范围,因

首先,我这样做是为了我自己,所以请不要建议“使用GMP/xint/bignum”(如果它适用的话)

我正在寻找一种将大整数(比如,超过9000位)转换为232表示的int32数组的方法。数字将以10为基数字符串开始

例如,如果我想将
字符串a=“4294967300”
(在基数10中)转换为新的基数232数组,它将是
int32\u t b[]={1,5}
。如果
int32_t b[]={32485738}
,则基数10将是
3*2^32+2485738
。很明显,我将使用的数字超出了偶数int64的范围,因此我无法准确地将字符串转换为整数并修改我的成功方式

我有一个10进制的减法函数。现在我想我只需要做
减法(char*number,“2^32”)
并计算多少次就可以得到一个负数,但对于较大的数字,这可能需要很长时间

有人能建议一种不同的转换方法吗?谢谢

编辑

很抱歉,如果您没有看到标记,我正在使用C++

将以10为基数的字符串转换为您的编号系统,从零开始继续将每个以10为基数的数字相加并乘以10。每次进位时,向基数为2^32的数组中添加一个新数字。

要将基数为10的字符串转换为数字系统,请从零开始,继续将每个基数为10的数字相加并乘以10。每次进位时,都要向基2^32数组添加一个新数字。

我想可能包含您要查找的内容,特别是
公共静态int set_str(int dest[],byte[]str,int str len,int base)的代码。
我想可能包含您要查找的内容,特别是
公共静态int set_str的代码(int dest[],byte[]str,int str_len,int base)

从将数字转换为二进制开始。从右边开始,每组32位是一个单基2^32位。

从将数字转换为二进制开始。从右边开始,每组32位是一个单基2^32位。

假设您的bignum类已经有乘法和加法,这相当简单:

 bignum str_to_big(char* str) {
     bignum result(0);
     while (*str) {
         result *= 10;
         result += (*str - '0');
         str = str + 1;
     }
     return result;
 }
另一种方式的转换是相同的概念,但需要除法和模

std::string big_to_str(bignum num) {
    std::string result;
    do {
        result.push_back(num%10);
        num /= 10;
    } while(num > 0);
    std::reverse(result.begin(), result.end());
    return result;
}

这两种方法都只适用于无符号。

假设您的bignum类已经有乘法和加法,它相当简单:

 bignum str_to_big(char* str) {
     bignum result(0);
     while (*str) {
         result *= 10;
         result += (*str - '0');
         str = str + 1;
     }
     return result;
 }
另一种方式的转换是相同的概念,但需要除法和模

std::string big_to_str(bignum num) {
    std::string result;
    do {
        result.push_back(num%10);
        num /= 10;
    } while(num > 0);
    std::reverse(result.begin(), result.end());
    return result;
}
这两种方法都只适用于无符号。

最简单(但不是最有效)的方法是编写两个函数,一个用于将大数乘以整数,另一个用于将整数与大数相加。如果忽略有符号数带来的复杂性,代码如下所示:

(编辑为使用
向量
以清晰起见,并为实际问题添加代码)

void mulbig(向量和bignum,uint16\u t被乘数)
{
uint32_t进位=0;
对于(无符号i=0;i>32);
}
如果(携带)
bignum.push_back(进位);
}
void addbig(向量和bignum,uint16\u t加数)
{
uint32_t进位=加数;
for(无符号i=0;进位(&i>32);
}
如果(携带)
bignum.push_back(进位);
}
然后,使用这些函数实现atobignum()非常简单:

void atobignum(const char *str,vector<uint32_t> &bignum)
{
    bignum.clear();
    bignum.push_back(0);
    while( *str ) {
        mulbig(bignum,10);
        addbig(bignum,*str-'0');
        ++str;
    }
}
void-atobignum(const-char*str、vector和bignum)
{
bignum.clear();
bignum.push_back(0);
while(*str){
mulbig(bignum,10);
addbig(bignum,*str-'0');
++str;
}
}
最简单(但不是最有效)的方法是编写两个函数,一个用于将大数乘以整数,另一个用于将整数与大数相加。如果忽略有符号数字带来的复杂性,代码如下所示:

(编辑为使用
向量
以清晰起见,并为实际问题添加代码)

void mulbig(向量和bignum,uint16\u t被乘数)
{
uint32_t进位=0;
对于(无符号i=0;i>32);
}
如果(携带)
bignum.push_back(进位);
}
void addbig(向量和bignum,uint16\u t加数)
{
uint32_t进位=加数;
for(无符号i=0;进位(&i>32);
}
如果(携带)
bignum.push_back(进位);
}
然后,使用这些函数实现atobignum()非常简单:

void atobignum(const char *str,vector<uint32_t> &bignum)
{
    bignum.clear();
    bignum.push_back(0);
    while( *str ) {
        mulbig(bignum,10);
        addbig(bignum,*str-'0');
        ++str;
    }
}
void-atobignum(const-char*str、vector和bignum)
{
bignum.clear();
bignum.push_back(0);
while(*str){
mulbig(bignum,10);
addbig(bignum,*str-'0');
++str;
}
}

你的长除法技能如何?@MichaelGoldshteyn:为什么?我把它转换错了吗?我的大脑在10进制以外的其他进制上工作得不太好。@sth128不,我想他是在暗示从10进制字符串到32进制整数数组的转换需要很多长除法技能。不过,我不认为Michael是对的,从a到base32到base10,需要除法。定义一个bignum类型(int32\u t的动态数组)。为该类型定义运算符*和运算符+。使用“长乘法”。从字符串重建它,就像从字符串重建int32_t一样。你知道,如何手动将字符串转换为int,对吗?它对任何整数都是一样的。从字符串生成int只需要加法和乘法运算符。你的长除法技能如何?@MichaelGoldshteyn:为什么?我成功了吗是不是搞错了?我的大脑不能很好地处理10进制以外的其他进制。@sth128不,我认为他是在暗示从10进制字符串到base32 int数组的转换需要很多长除法技巧。我认为Michael是不对的,从base32到base10需要除法。定义一个bignum类型(int32_t的动态数组)。为类型定义运算符*和运算符+。使用“长乘法”。用重构int3的方法从字符串中重构它