C语言 不使用“-”运算符的两个数相减

dpiehjr4  于 2023-06-21  发布在  其他
关注(0)|答案(5)|浏览(118)

我尝试了下面的代码,但我不明白为什么它给了我错误的答案。我在计算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;
}
zz2j4svz

zz2j4svz1#

我使用了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;
}
hs1ihplo

hs1ihplo2#

考虑到负数是如何表示的,下面将计算a - b:

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

正如OP已经指出的:)这将注意力转移到您的add实现上,这当然是错误的。下面是一个奇怪的方法(因为已经给出了其他更好的方法)

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

(保持同样的想法,代码可以做得更好,只是太累了,做得更好)

zlhcx6iw

zlhcx6iw3#

你也可以递归地实现它。在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;
}
ssm49v7z

ssm49v7z4#

add方法实现不正确。这样做->一个Java的方式。

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

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

ogq8wdun5#

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



 }


 }

相关问题