Вычитание двух чисел без использования оператора «-»

Я пробовал использовать следующий код, но не могу понять, почему он дает мне неправильный ответ. Я вычисляю два дополнения и добавляю с другим номером.

#include <stdio.h>

int add(int a, int b) {
    while (a) {
        a = (a & b) << 1;
        b = a^b;
    }
    return b;
}

int sub(int a, int b) // add a with b's 2's complement.
{
    return (add(a, add(~b, 1)));
}

int main() {
    int a, b, res;
    a = 3, b = 1;
    res = sub(a, b);
    printf("%d\n", res);
    return 0;
}
7
задан Carlos Muñoz 8 August 2010 в 13:54
поделиться

2 ответа

Я использовал другую функцию add (), предложенную NullUserException, теперь она работает:

int add(int a,int b)
{
  int x;
  x = a^b;

  while(a&b)
  {
    b = ((a&b)<<1);
    a = x;
    x = a^b;
    //b=(a^b);
  }

  return x;
}
6
ответ дан 7 December 2019 в 12:13
поделиться

Учитывая, как представлены отрицательные числа, следующее вычислит a - b:

int a, b, c;
// assign to a and b
c = a + (~b + 1); // () not needed, just to show the point

как уже отмечалось OP :) Это привлекает внимание к вашей реализации добавления, что, конечно, неверно. Следующее - это странный способ сделать это (просто потому, что другие лучшие способы уже даны)

int add1(int a, int b, int *c)
{
  int r = *c & 1;
  a &= 1; b &= 1;
  *c = a&b | a&r | b&r;
  return a^b^r;
}
int inv(int a)
{
  int i, r = 0;
  for(i = 0; i < sizeof(int)*8; i++)
  {
    r = r<<1 | (a&1);
    a >>= 1;
  }
  return r<<1;
}
int add(int a, int b)
{
  int r = 0, i;
  int c = 0;
  for(i=0; i < sizeof(int)*8; i++)
  {
    r |= add1(a>>i, b>>i, &c);
    r <<= 1;
  }
  return inv(r);
}

int sub(int a, int b)
{
  return add(a, add(~b, 1));
}

(сохраняя ту же идею, код можно улучшить, просто слишком устал, чтобы делать это лучше)

1
ответ дан 7 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: