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

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

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

那么,你可以做的是 – 只观察符号位(二进制补码中最重要的一位) – 使用异或来判断两个原始数字是否在符号上有所不同,补充这一点以便你得到’0’如果他们是不同的,同样的’1’。

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

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

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

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

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