C(HW)中的逐位饱和加法

时间:2011-03-11 19:50:50

标签: c bit-manipulation addition

我正在完成一项任务,但我无法弄清楚如何实现这一目标。我必须创建一个函数sadd(int x,int y),它返回添加在一起的数字,除非它溢出(然后只返回max possible int)。我已经能够提出一些涉及强制转换和条件语句的解决方案,但解决方案中不允许这些解决方案。只有经营者〜! ^ +<< >> &安培;和|。

3 个答案:

答案 0 :(得分:6)

如果添加两个相同符号的数字并获得带有不同符号的结果,则添加有符号数字时会发生溢出。由于涉及范围,在添加两个不同符号时不可能产生溢出。

所以,你可以做的是 - 只观察符号位(两个补码中最重要的一个) - 使用异或来判断两个原始数字是否有不同的符号,补充这个以便你得到' 0'如果它们不同,'1'表示相同。

然后,您可以对结果与其中一个输入使用异或。如果它们是相同的那么'0',如果它们不同则给'1'。

如果两个输入相同但结果不同,那么这两个结果一起得到整体'1',否则为'0'。

然后,您可以使用移位和OR的组合来使用该值填充整个整数。假设您是32位整数,只需设置最低31位以获得最高值正整数。然后你可以做的是在任一输入的符号位上进行类似的移位和OR运算。独家OR结果。如果输入是负数,那么它将给出最小值整数。

编辑:哦,并使用是否存在溢出的位值,扩展为填充int,选择返回的值,并将结果返回,如果存在溢出则返回,补充它并将其置换使用正常的加法结果,然后将两者结合在一起(或加入)。

Presto:所有二进制逻辑,无条件。我认为,因为它是家庭作业,你不想要实际的代码吗?

答案 1 :(得分:1)

这很简单。如果Movements.js大于x + y,则溢出。因此,如果操作数INT_MAX大于y,则不能将其与INT_MAX - x一起添加,反之亦然。

x

答案 2 :(得分:0)

来自ARM网站的内在函数:

4.1编译器内在函数

编译器内在函数是编译器提供的函数。它们使您能够轻松地将特定于域的操作合并到C和C ++源代码中,而无需诉诸于汇编语言中的复杂实现。 C和C ++语言适用于各种各样的任务,但是它们不为特定应用领域提供内置支持,例如,数字信号处理(DSP)。 在给定的应用程序域中,通常必须执行一系列特定于域的操作。但是,通常无法在C或C ++中有效地实现这些操作。一个典型的例子是两个32位带符号的两个补码整数的饱和加法,通常在DSP编程中使用。以下示例显示了饱和添加操作的C实现

#include <limits.h>
int L_add(const int a, const int b)
{
    int c;
    c = a + b;
    if (((a ^ b) & INT_MIN) == 0)
    {
        if ((c ^ a) & INT_MIN)
        {
            c = (a < 0) ? INT_MIN : INT_MAX;
        }
    }
    return c;
}

ARM Info Center