View Full Version : [C/C++] Sottrazione binaria
SerMagnus
04-09-2011, 13:40
Salve raga,
stavo giocando un po' con l'aritmetica binaria e gli operatori di bitwise e mi sono incartato volendo implementare un algoritmo per la sottrazione aritmetica binaria (ossia op1>op2, e op1-op2 naturali).
so che è necessario effettuare un XOR tra gli operandi per ottenere il nuovo sottraendo da utilizzare per le successive iterazioni, e che per calcolarmi il resto devo effettuare una AND tra NOT(op1) e op2. il ciclo continua finquando il resto nn è zero.
il problema è il seguente, ho fatto l'algoritmo ma fa un po' quello che gli pare.. a volte somma, altre da una differenza giusta, altre spara numeri a caso :fagiano:
unsigned int differenza_binaria(unsigned int a, unsigned int b){
int diff;
int resto=-1;
while(resto!=0){
diff = a ^ b;
resto = !a & b;
resto = resto << 1;
a = diff;
b = resto;
}
return a;
}
Qualcuno sa darmi una mano? :D
Il punto è questo, non so di preciso come implementare l'algoritmo, ho letto solo di come dovrebbe essere fatto (diff e resto), per il resto mi sono appoggiato a quello dell'addizione binaria. Ho googlato per svariate ore senza trovare nulla >.<
Salve raga,
stavo giocando un po' con l'aritmetica binaria e gli operatori di bitwise e mi sono incartato volendo implementare un algoritmo per la sottrazione aritmetica binaria (ossia op1>op2, e op1-op2 naturali).
so che è necessario effettuare un XOR tra gli operandi per ottenere il nuovo sottraendo da utilizzare per le successive iterazioni, e che per calcolarmi il resto devo effettuare una AND tra NOT(op1) e op2. il ciclo continua finquando il resto nn è zero.
il problema è il seguente, ho fatto l'algoritmo ma fa un po' quello che gli pare.. a volte somma, altre da una differenza giusta, altre spara numeri a caso :fagiano:
unsigned int differenza_binaria(unsigned int a, unsigned int b){
int diff;
int resto=-1;
while(resto!=0){
diff = a ^ b;
resto = !a & b;
resto = resto << 1;
a = diff;
b = resto;
}
return a;
}
Qualcuno sa darmi una mano? :D
Il punto è questo, non so di preciso come implementare l'algoritmo, ho letto solo di come dovrebbe essere fatto (diff e resto), per il resto mi sono appoggiato a quello dell'addizione binaria. Ho googlato per svariate ore senza trovare nulla >.<
dipende dalla rappresentazione binaria che hai dato alle tue quantità decimali, nel modulo e segno, ad esempio, la sottrazione non è altro che una addizione ( come avviene anche nella classica algebra scolastica )
solitamente si usa proprio la rappresentazione in modulo e segno.
http://it.wikipedia.org/wiki/Sistema_numerico_binario
SerMagnus
05-09-2011, 14:30
la rappresentazione è quella predefinitita, quindi in modulo 2^n.
lo scopo dell'algoritmo è lavorare su interi positivi quindi è una semplice somma binaria (ecco perché unsigned int), quindi ha proprio l'obbiettivo di giocare direttamente sui singoli bit.
Salve raga,
stavo giocando un po' con l'aritmetica binaria e gli operatori di bitwise e mi sono incartato volendo implementare un algoritmo per la sottrazione aritmetica binaria (ossia op1>op2, e op1-op2 naturali).
so che è necessario effettuare un XOR tra gli operandi per ottenere il nuovo sottraendo da utilizzare per le successive iterazioni, e che per calcolarmi il resto devo effettuare una AND tra NOT(op1) e op2. il ciclo continua finquando il resto nn è zero.
il problema è il seguente, ho fatto l'algoritmo ma fa un po' quello che gli pare.. a volte somma, altre da una differenza giusta, altre spara numeri a caso :fagiano:
unsigned int differenza_binaria(unsigned int a, unsigned int b){
int diff;
int resto=-1;
while(resto!=0){
diff = a ^ b;
resto = !a & b;
resto = resto << 1;
a = diff;
b = resto;
}
return a;
}
Qualcuno sa darmi una mano? :D
Il punto è questo, non so di preciso come implementare l'algoritmo, ho letto solo di come dovrebbe essere fatto (diff e resto), per il resto mi sono appoggiato a quello dell'addizione binaria. Ho googlato per svariate ore senza trovare nulla >.<
Leggo ora questo tuo post, e anche se immagino tu abbia risolto, a quest'ora, volevo precisare che il programma è scritto in maniera ineccepibile, tranne per il fatto che alla riga 6 ("resto = !a & b;") neghi utilizzando "!" che è un operatore logico, mentre, visto che operi sui singoli bit dovresti utilizzare una tilde, "~".
In effetti è una function molto simile a quella relativa all'addizione binaria, cambia giusto qualcosina. :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.