加上大数操作

时间:2014-03-05 02:44:05

标签: c++ c

有两个n位数存储在两个字节数组中(little-endian)。

例如:40位数字可以表示为:char c[5] = {0xff, 0xff, 0xff, 0xff, 0x01} ;,它是0xffffffff01

我的问题是 如何在C或C ++中有效地对两个n位数实现加号操作

实际上我想在大数字上实现基本操作,由字节数组表示。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

基本方法与您在小学时学到的方法相同。从最低有效字节开始,添加两个字节以及传入进位。如果有外带,请将其带到下一组。

当然今天的处理器是32位或64位,因此使用uint32_tuint64_t作为基本类型而不是char更有意义。请注意,您可能需要 unsinged ,而不是签名。

您始终可以查看为此目的而编写的库中的代码。 GMP有一对“mini-gmp”的.h / .c文件,可以实现最基本的操作。您可以在此处在线浏览:mini-gmp.hmini-gmp.c。特别是,您感兴趣的功能是mpz_add。 Google找到example usagempz_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