有两个n位数存储在两个字节数组中(little-endian)。
例如:40位数字可以表示为:char c[5] = {0xff, 0xff, 0xff, 0xff, 0x01} ;
,它是0xffffffff01
。
我的问题是 如何在C或C ++中有效地对两个n位数实现加号操作 ?
实际上我想在大数字上实现基本操作,由字节数组表示。有什么建议吗?
答案 0 :(得分:3)
基本方法与您在小学时学到的方法相同。从最低有效字节开始,添加两个字节以及传入进位。如果有外带,请将其带到下一组。
当然今天的处理器是32位或64位,因此使用uint32_t
或uint64_t
作为基本类型而不是char
更有意义。请注意,您可能需要 unsinged ,而不是签名。
您始终可以查看为此目的而编写的库中的代码。 GMP有一对“mini-gmp”的.h / .c文件,可以实现最基本的操作。您可以在此处在线浏览:mini-gmp.h,mini-gmp.c。特别是,您感兴趣的功能是mpz_add
。 Google找到example usage。 mpz_add
委托其他职能部门,但第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
。