Subtracting two numbers without using '-' operator

前端 未结 5 2049
北荒
北荒 2021-02-04 17:07

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.

#inclu         


        
相关标签:
5条回答
  • 2021-02-04 17:45
    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);
    
    
    
    
    
     }
    
    
    
     }
    
    0 讨论(0)
  • 2021-02-04 17:48

    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)

    0 讨论(0)
  • 2021-02-04 17:53

    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;
    }
    
    0 讨论(0)
  • 2021-02-04 17:59

    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;
    }
    
    0 讨论(0)
  • 2021-02-04 18:07

    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)); 
    
      }
    
    0 讨论(0)
提交回复
热议问题