不使用’ – ‘运算符减去两个数字

我尝试使用以下代码,但我无法理解为什么它给了我错误的答案。 我正在计算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; } 

我使用了NullUserException建议的不同的add()函数,它现在可以工作:

 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 

正如OP已经注意到的那样:)这会将注意力转移到你的添加实现上,这当然是错误的。 以下是一种奇怪的方法(因为已经给出了其他更好的方法)

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

(保持相同的想法,代码可以做得更好,太累了,不能做得更好)

add方法实现不正确。 这样做 – >一种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)); } 

您也可以递归地实现此function。 在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); } }