pranay
pranay

Reputation: 2369

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

Upvotes: 7

Views: 36081

Answers (5)

Mohammad Adnan
Mohammad Adnan

Reputation: 6627

add method implementation is incorrect. do like this -> A java way of this.

public int add(int a, int b){
  if (b > 0) {
    do {
      a = a & b; //carry
      b = a ^ b;  //addition
      a = a << 1; //carry shift to one bit left
    }while(a != 0);  //exit 
   } else {
     b = a;
   }
   return b;     //addition result
 }

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

Upvotes: 1

Max Kapsecker
Max Kapsecker

Reputation: 514

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

Upvotes: 2

Akash Das
Akash Das

Reputation: 49

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.xml.soap.Node;

public class mainone {





 public static void main(String args[]){


 int a=12;
 int b=4;
 Integer  c=new Integer(b);
 String  d=Integer.toString(c);
 String e="-";
 String f=e.concat(d);
 Integer g=Integer.parseInt(f);
 System.out.println(a+g);





 }



 }

Upvotes: -4

pranay
pranay

Reputation: 2369

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

Upvotes: 6

ShinTakezou
ShinTakezou

Reputation: 9671

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)

Upvotes: 2

Related Questions