创建方法,使用按位运算检查x + y是否会溢出

时间:2012-04-14 15:53:28

标签: c methods overflow bit-manipulation addition

我需要使用按位运算在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;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

这应该可行,但它不仅使用按位运算符,但它适用于signed:

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;
}