我尝试使用以下代码,但我无法理解为什么它给了我错误的答案。我正在计算2的补码并添加另一个。
#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;
}
答案 0 :(得分:6)
我使用了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;
}
答案 1 :(得分:1)
考虑如何表示负数,以下将计算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));
}
(保持相同的想法,代码可以变得更好,太累了,不能做得更好)
答案 2 :(得分:1)
添加方法实现不正确。 这样做 - &gt;一种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));
}
答案 3 :(得分:1)
您也可以递归地实现此功能。在C中,这可能看起来像:
#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;
}
答案 4 :(得分:-4)
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);
}
}