2

我需要使用按位运算在 C 中创建一个方法,该方法检查 x + y 是否会溢出。我最多只能使用以下操作中的 20 个;!~ & ^ | + << >> 请记住,我必须同时测试负数和正数。

我已经尝试了好几次让它工作。我的逻辑合理吗?我要去:如果(x + y)小于x,那么它已经溢出。基于这个逻辑,我写了这个;

int addOK(int x, int y)
{
  int sum = x + y;
  int nx = ((~x) + 1);
  int check = (sum + nx)>>31;
  return !check;
}

谢谢!

4

1 回答 1

0

这应该有效,但它不仅使用按位运算符,而且适用于有符号的:

int addOK(int x, int y)
{
  int check;
  if (greaterThan(0, x^y)) 
    check = 0; 
  else if (greaterThan(x, 0)) 
    check = greaterThan(y, INT_MAX -x);
  else 
    check = greaterThan(INT_MIN -x, y);

  return check;
}

int greaterThan(int first, int second) {
   /* first > second means second - first is less than 0
      shift the sign bit and then compare it to 1 */
   return (second + (~first +1)) >> ((sizeof(int) * 8) -1) & 1;
}

如果这两个数字都是正数就足够了:

int addOK(int x, int y) {
 if(x^y < 0)
   return 0;

 return 1;
}
于 2012-04-14T16:09:26.193 回答