gpt4 book ai didi

c - C (HW) 中的按位饱和加法

转载 作者:太空狗 更新时间:2023-10-29 17:11:33 24 4
gpt4 key购买 nike

我正在做一项作业,但我不知道如何实现它。我必须做一个函数 sadd(int x, int y)返回加在一起的数字,除非它溢出(然后只返回最大可能的整数)。我已经能够想出一些涉及强制转换和条件语句的解决方案,但这些在解决方案中是不允许的。只有运营商 ~ ! ^ + << >> &| .

最佳答案

对于有符号数的加法,如果将两个相同符号的数字相加得到不同符号的结果,就会发生溢出。由于涉及范围,两个不同符号的数相加不可能产生溢出。

因此,您可以做的是——只观察符号位(二进制补码中最重要的一位)——使用异或来确定两个原始数字的符号是否不同,对其进行补码,以便得到 '如果它们不同,则为 0',如果它们相同,则为 '1'。

然后您可以对结果与其中一个输入使用异或。如果它们相同,则给出“0”,如果不同,则给出“1”。

如果两个输入相同但结果不同,则这两个结果加在一起得到整体“1”,否则为“0”。

然后您可以使用移位和 OR 的组合来用该值填充整个整数。假设你是一个 32 位整数,只要设置最低的 31 位就可以得到最高值的正整数。然后你可以做的是在任一输入的符号位上进行一组类似的移位和 OR。异或结果。如果输入为负数,则会给出最小值整数。

编辑:哦,并使用是否有溢出的位值,扩展到填充 int,通过将其与如果有溢出时将返回的结果相加来选择要返回的值,将其补充并与它相加与正常的相加结果,然后将两者进行或运算(或相加)。

Presto:所有二进制逻辑,没有条件。我假设,因为这是家庭作业,所以您不需要实际代码?


九年后,我同意下面@gman 的评论;为了仅使用允许的运算符实现饱和加法,您必须依赖未定义的行为——上面的答案隐含地这样做

这样做的一个重大风险是编译器知道哪些行为是未定义的,并可能在优化期间利用它。了解底层架构(例如,它是二进制补码,它进行带符号的移位)不足以预测编译器的输出。

稳健的生产实现是可能的,但需要条件语句,因此不会回答这个问题。

关于c - C (HW) 中的按位饱和加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5277623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com