【问题标题】:What operation does the function perform?该函数执行什么操作?
【发布时间】:2014-03-01 05:38:50
【问题描述】:
int function(uint32_t *r, const uint32_t *a, const uint32_t *b, int n)
{
 int i;
 uint32_t ri, c=0;
 for (i = 0; i < n; i ++)
 {
   ri = a[i] + b[i] + c;
   c = ((ri < a[i]) || ((ri == a[i]) && c));
   r[i] = ri;
 }
   return ((int) c);
}

下面给出的 C 函数有四个参数:r、a 和 b 是指向数组的指针 uint32_t 类型。整数 n 指定这些数组的长度(即所有三个数组 包含相同数量的元素)。返回值是 int 类型。任何人都可以帮助我了解此功能执行的操作吗?

【问题讨论】:

    标签: c functional-programming ansi


    【解决方案1】:

    它正在执行带有进位传播的多精度加法。 ab 参数是指向每个具有 n 数字的多精度整数的指针。在这种情况下,数字是 32 位。最低有效数字位于最低的数组索引中。

    将输入相加,并将结果放入r 指向的数组中(也包含n 32 位数字)。它的工作原理是将 a 中的一个数字添加到 b 中的一个数字,并带有进位 c,初始化为零。当结果位小于输入数字之一时检测到进位,或者当进位为 1 时检测到进位。返回值是整个操作的进位。

    想象一下,我们正在添加以 10 为底的数字。如果我们计算 9+9+0 mod 10,我们得到 8。由于 8 小于 9,我们推断一定有一个进位。如果我们计算 9+9+1 模 10,我们得到 9;由于设置了进位,我们推断出进位。如果我们计算 9+0+0,我们得到 9,但是没有进位,因为进位是 0。

    【讨论】:

      【解决方案2】:

      在循环的每个元素上,一个临时变量存储 a 和 b 中两个对应元素的总和,如果设置了标志,则加 1。然后当结果小于 a 中的元素时设置标志,如果大于则重置。该结果存储在一个新数组中。显然,我们可以看到结果小于(大于)if b[i] + c &lt; 0 (&gt;) 中的元素。但是,两个指数都必须是正数;如果三个加数的总和小于其中一个,则有一个环绕。因此,变量c 保存了加法是否溢出,相当于为下一对元素携带一个1。因此,该函数将任意精度的无符号数ab相加(表示为little-endian数组),将结果复制到r,并返回是否存在溢出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-12
        • 2021-09-24
        • 1970-01-01
        • 2015-03-27
        相关资源
        最近更新 更多