【问题标题】:Saturating signed integer addition with only bitwise operators in C (HW)在 C (HW) 中仅使用位运算符饱和有符号整数加法
【发布时间】:2013-10-13 10:07:22
【问题描述】:

对于家庭作业,我必须用 C 语言编写一个函数,将两个有符号整数相加,但如果出现正溢出则返回 INT_MAX,如果出现负溢出则返回 INT_MIN。对于可以使用的运算符,我必须遵守非常严格的限制。所有整数都是二进制补码形式,右移是算术,整数大小是可变的(我可以用 sizeof(int)

我知道如果两个输入具有相同的符号并且结果具有不同的符号,则可以检测到溢出。我已经到了有一个标志显示等式是否溢出的地步。我不知道如何从那里到达最终产品。这是我到目前为止所拥有的:

int saturating_add(int x, int y){
    int w = sizeof(int)<<3;
    int result = x+y;
    int signX = (x>>w-1)&0x01;//Sign bit of X
    int signY = (y>>w-1)&0x01;//Sign bit of Y
    int resultSign = (result>>w-1)&0x01; //Sign bit of result
    int canOverflow = ~(signX ^ signY); //If they're the same sign, they can overflow
    int didOverflow = (resultSign^signX)&canOverflow; //1 if input signs are same and result sign different, 0 otherwise

}

我正在尝试遵循Bitwise saturated addition in C (HW) 中显示的答案,但我被困在必须用相同位填充除符号位之外的所有整数的部分(1 转到 0111..11 0 到 0000.00)。我不知道“班次和 OR 的组合”是什么。

【问题讨论】:

  • 为什么投反对票?这似乎足够有效。

标签: c bit-manipulation addition


【解决方案1】:

我认为您误解了答案。您应该做的是将符号位扩展到所有位,包括 MSB。这可以通过获取包含符号位的 int 来完成,例如didOverflow,并将其补码加 1。

然后你找到在溢出的情况下应该返回哪个溢出值。这可以通过对INT_MAX 与扩展signX 进行异或运算来完成(或signY,两者都可以)。让我们将此值称为overflow。最后,像这样改变overflowresult

overflow := (extended didOverflow) AND overflow
result := (NOT (extended didOverflow)) AND result

现在,在这些分配之后,如果扩展 didOverflow 是 1...1,那么 overflow 显然将保持不变。另一方面,result 将等于 0。

但如果 didOverflow 为 0...0,则相反:overflow 现在为 0,而 result 保持不变。

在第一种情况下(didOverflow 为 1...1,表示存在溢出),overflow OR result 等于 overflow。在第二种情况下(我们没有溢出),overflow OR result 等于 result。所以无论哪种方式,overflow OR result 都会给我们正确的值。

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 2013-07-08
    • 2011-07-13
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多