Subtracting two numbers without using '-' operator

别等时光非礼了梦想. 提交于 2019-12-04 08:38:58

问题


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

回答1:


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



回答2:


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)




回答3:


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

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

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

  }



回答4:


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



回答5:


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





 }



 }


来源:https://stackoverflow.com/questions/3430651/subtracting-two-numbers-without-using-operator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!