有两个n位数字,它们存储在两个字节的数组中(小尾数)。
例如:40位数字可以表示为:char c[5] = {0xff, 0xff, 0xff, 0xff, 0x01} ;
,它是0xffffffff01
。
我的问题是如何在C或C++的中有效地对两个n位数字执行加运算?
实际上,我想对以字节数组表示的大量数字执行基本操作。有什么建议吗?
最佳答案
基本方法与您在小学学习的方法相同。从最低有效字节开始,将两个字节与传入的进位相加。如果有外出携带,则将其携带到下一组。
当然,当今的处理器是32位或64位,因此使用uint32_t
或uint64_t
作为基本类型而不是char
更有意义。请注意,您可能想要未加注单但未签名。
您总是可以查看为此目的编写的库中的代码。 GMP有一对“hg..c”文件,可以实现最基本的操作。您可以在此处在线浏览它们:mini-gmp.h,mini-gmp.c。特别是,您感兴趣的函数是mpz_add
。 Google找到example usage。 mpz_add
委托(delegate)给其他函数,但是在第393行中,肉似乎是该函数:
mp_limb_t
mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
{
mp_size_t i;
mp_limb_t cy;
for (i = 0, cy = 0; i < n; i++)
{
mp_limb_t a, b, r;
a = ap[i]; b = bp[i];
r = a + cy;
cy = (r < cy);
r += b;
cy += (r < b);
rp[i] = r;
}
return cy;
}
我将由您自己决定类型的含义,内存分配的工作方式等,但是将
mp_limb_t
视为char
。关于c++ - 大批量加号操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22187445/