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

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

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

Я использовал другую функцию 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; } в 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; } 

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

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

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

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

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

неверная реализация метода добавления. сделайте это -> Java способ этого.

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

Вы также можете реализовать это рекурсивно. В C это может выглядеть так:

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