Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subtracting two numbers without using '-' operator

i tried with the following code , but i can't understand why it's giving me wrong answer. i am computing the 2's complement and adding with another no.

#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;
}
like image 837
pranay Avatar asked Aug 07 '10 13:08

pranay


3 Answers

i used a different add() function as suggested by NullUserException, it works now:

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;
}
like image 58
pranay Avatar answered Nov 15 '22 13:11

pranay


Considering how negative numbers are represented, the following will compute a - b:

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

as the OP already noted:) This moves the attention to your add implementation, that is of course wrong. The following is an odd way to do it (just since other better ways are already given)

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

(keeping the same idea the code can be made better, just too tired to do it finer)

like image 40
ShinTakezou Avatar answered Nov 15 '22 15:11

ShinTakezou


You also can implement this recursively. In C this might look like:

#include <stdio.h>

int add(int a, int b){
    if(b == 0) return a;
    int sum = a ^ b;
    int carry = (a & b) << 1;
    return add(sum, carry);
}

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

int main(){

    int a = 3;
    int b = 1;

    int sum = add(a, b);
    printf("%i + %i = %i \n", a, b, sum);

    int difference = subtract(a, b);
    printf("%i - %i = %i \n", a, b, difference);

    return 0;
}
like image 2
Max Kapsecker Avatar answered Nov 15 '22 15:11

Max Kapsecker