2010-08-07 17 views
5

ho provato con il seguente codice, ma non riesco a capire perché mi sta dando una risposta sbagliata. sto calcolando il complemento a 2 e aggiungendo con un altro no.Sottraendo due numeri senza utilizzare l'operatore '-'

#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()' si sta dando il risultato sbagliato, perché 'add()' è sbagliato. La logica in 'sub()' va bene. – NullUserException

+0

Cosa c'è di sbagliato in '-'? Cosa c'è di sbagliato in 'a + b'? –

+0

Anche questo riporta alla memoria. Il nostro professore non ci permetterebbe di usare loop, o dichiarazioni "if" per quella materia. – NullUserException

risposta

4

ho usato una diversa funzione add() come suggerito da NullUserException, funziona ora:

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

Questo attraverso un errore mentre l'istruzione (a & b) come aeb non è booleana –

+6

@ChiragTayal in C quasi tutto può essere un booleano. – Flexo

+1

@ChiragTayal 0 è falso e tutti gli altri numeri sono veri in C – REALFREE

1

Considerando come numeri negativi sono rappresentati, la seguente calcolerà a - b:

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

come già osservato dall'OP :) Ciò sposta l'attenzione sull'implementazione di aggiunta, che è ovviamente errata. Quello che segue è uno strano modo di farlo (solo in quanto altri modi migliori sono già forniti)

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

(mantenendo la stessa idea il codice può essere fatta meglio, troppo stanchi per farlo più fine)

+1

L'OP lo ha ottenuto. – quantumSoup

+1

il titolo è "Sottraendo due numeri senza utilizzare" - "operatore" che non significa implementare add/sub bit per bit come il codice mostrato, è solo il modo in cui si pensava che potesse essere fatto, ma non c'è alcun indizio sul motivo per cui l'insegnante ti ha chiesto quella. Forse vuole essere sicuro di aver capito il complemento a 2, e ~ essendo un operatore bit a bit, rende l'intero codice bitwise - così anche questo è preso in considerazione. Inoltre, qui non c'è questa semplice intuizione, quindi la risposta non può essere "inutile" (come dice il pulsante in basso) – ShinTakezou

+0

ops: tutto quel codice lo nasconde! - ed è oscura la connessione tra titolo e codice. Questo dimostra che la soluzione è giusta, a condizione che add venga implementata correttamente :) - i titoli dovrebbero essere più "prendili" – ShinTakezou

2

aggiungere l'implementazione del metodo non è corretta. fai questo -> Un modo java di questo.

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





} 



}