2

x + y がオーバーフローするかどうかをチェックするビット演算を使用して、C でメソッドを作成する必要があります。次の操作は最大 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

これは機能するはずですが、ビット単位の演算子のみを使用するのではなく、 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;
}

2 つの数値が両方とも正である場合は、十分なはずです。

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

 return 1;
}
于 2012-04-14T16:09:26.193 に答える