c++ - 对大数进行加法运算

标签 c++ c

有两个n位数字存储在两个字节数组(小端)中。

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

我的问题是如何在 C 或 C++ 中高效地实现两个 n 位数字的加运算

其实我想实现对字节数组表示的大数的基本操作。有什么建议吗?

最佳答案

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

当然,今天的处理器不是 32 位就是 64 位,所以使用 uint32_t 更有意义或 uint64_t作为基本类型而不是 char .请注意,您可能希望未签名,而不是已签名。

您始终可以查看为此目的编写的库中的代码。 GMP 有一对“mini-gmp”.h/.c 文件,可实现最基本的操作。您可以在这里在线浏览它们:mini-gmp.h , mini-gmp.c .特别是,您感兴趣的函数是 mpz_add .谷歌发现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/

相关文章:

c++ - 通过推送反转链表的顺序

python - 在 Cython 中使用 zlib 压缩 NumPy 数组

c++ - 有没有可能不用暴力破解这个方程式?

c - ANSI C 中的外部/构建 TCP 数据包

c - Valgrind:地址 0x0 未被堆叠、分配或(最近)释放仅用于较大的输入值

c++ - 为什么这行得通? [C++;空指针]

C++ 字符串前向声明不明确

c++ - QGroupBox 中的 QScrollArea

objective-c - 使用 0.5 规则舍入 float 的方法

c++ - 一个比较奇怪的现象Excel MFC ADO数据库编程