有两个n位数字,它们存储在两个字节的数组中(小尾数)。

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

我的问题是如何在C或C++的中有效地对两个n位数字执行加运算?

实际上,我想对以字节数组表示的大量数字执行基本操作。有什么建议吗?

最佳答案

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

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

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

10-13 00:08