2010-08-07 14 views
5

intenté con el siguiente código, pero no puedo entender por qué me está dando una respuesta incorrecta. Estoy computando el complemento de 2 y agregando otro no.Restando dos números sin usar el operador '-'

#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; 
} 
+4

'sub()' le está dando un resultado erróneo porque 'add()' que está mal. La lógica en 'sub()' está bien. – NullUserException

+0

¿Qué pasa con '-'? ¿Qué pasa con 'a + b'? –

+0

Esto trae recuerdos también. Nuestro profesor no nos permitió usar bucles, o declaraciones 'si' para el caso. – NullUserException

Respuesta

4

He utilizado una función diferente add() según lo sugerido por NullUserException, funciona ahora:

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

Esto hará que a través de un error en while (a & b) la declaración como ayb no sea booleana –

+6

@ChiragTayal en C casi cualquier cosa puede ser un booleano. – Flexo

+1

@ChiragTayal 0 es falso y todos los demás números son verdaderos en C – REALFREE

1

Teniendo en cuenta cómo se representan los números negativos, lo siguiente será calcular a - b:

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

como ya se indicó el OP :) Esto mueve la atención a la implementación de su complemento, eso es, por supuesto, incorrecto. La siguiente es una extraña manera de hacerlo (justo ya que otras formas mejores ya están dadas)

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

(manteniendo la misma idea que el código puede hacerse mejor, demasiado cansado para hacerlo más fino)

+1

El OP lo consiguió. – quantumSoup

+1

el título es "Restar dos números sin usar '-' operador 'que no significa implementar agregar/subar en bit como el código que se muestra, así es como creías que se podía hacer, pero no hay ninguna pista sobre por qué el profesor te preguntó ese. Tal vez quiere estar seguro de haber entendido el complemento de 2, y ~ como operador de bit a bit, hace todo el código en bits, por lo que también se tiene en cuenta. Además, aquí no hay esta simple idea, por lo que la respuesta no puede ser "inútil" (como dice el botón hacia abajo) – ShinTakezou

+0

ops: ¡todo ese código lo oculta! - y no es clara la conexión entre el título y el código. Esto muestra que la solución es correcta, siempre que el complemento se implemente correctamente :) - los títulos deberían ser más "atraparlo" – ShinTakezou

2

La implementación del método add es incorrecta. haz clic aquí -> Una forma de hacerlo.

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





} 



} 
Cuestiones relacionadas