Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [RISOLTO]Sottrazione con operatori bitwise
Forum - C/C++ - [RISOLTO]Sottrazione con operatori bitwise

Avatar
mycronapoli (Normal User)
Newbie


Messaggi: 17
Iscritto: 28/01/2011

Segnala al moderatore
Postato alle 20:34
Martedì, 12/04/2011
Ragazzi ho un problema con questo programma. Deve effettuare la sottrazione tra 2 numeri attraverso i numeri binari.
Ora qual è il problema in questo codice? Perchè se io faccio "2-1" il programma mi fa uscire 2!!!
Ecco il codice:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int sub_bitwise(int op1, int op2);
  4. int main()
  5. {
  6.     int op1,op2,res;
  7.     printf("\t***************************\n");
  8.     printf("\t* Sottrazioni con bitwise *\n");
  9.     printf("\t***************************\n\n");
  10.     printf("Inserisci il primo operando: ");
  11.     scanf("%d",&op1);
  12.     printf("Inserisci il secondo operando: ");
  13.     scanf("%d",&op2);
  14.     res=sub_bitwise(op1,op2);
  15.     printf("Il risultato della sottrazione e' %d\n",res);
  16.     system("PAUSE");
  17.     return 0;
  18. }
  19.  
  20. int sub_bitwise(int op1, int op2)
  21. {
  22.     int pres, sub;
  23.         while (pres>0)
  24.         {
  25.             sub=op1^op2;//Sottrazione = xor (op1,op2)
  26.             op1=~op1;// inizio Prestito = and(not(op1),op2)
  27.             pres=op1&op2; // fine prestito
  28.             op1=sub;
  29.             op2=pres;
  30.         }
  31.     return sub;
  32. }



Grazie mille per l'attenzione! ;):D

Ultima modifica effettuata da mycronapoli il 14/04/2011 alle 22:21


Abbiamo bisogno di idee, non di ideali.
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:06
Martedì, 12/04/2011
1. Inizializza le tua variabili prima di usarle.

2.
Codice sorgente - presumibilmente Plain Text

  1. op1=~op1;// inizio Prestito = or(not(op1),op2)
  2. pres=op1&op2; // fine prestito



& e' l'operatore per l'and binario. Se segui i commenti che hai scritto dovresti usare |.

Ma questo algoritmo dove l'hai trovato?


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
mycronapoli (Normal User)
Newbie


Messaggi: 17
Iscritto: 28/01/2011

Segnala al moderatore
Postato alle 10:41
Mercoledì, 13/04/2011
1. Perchè dovrei inizializzarle? Con l'algoritmo della somma (non molto diverso da questo) ha funzionato tranquillamente :-| (non sono un grande programmatore sono agli inizi...:asd: )
2. Errore mio per quanto riguarda i commenti! Ho scritto or invece di and... correggo subito...
3. L'algoritmo l'ho fatto io... in realtà dovrebbe essere la soluzione di un esercizio dell'università.

Grazie per l'attenzione!;:D


Abbiamo bisogno di idee, non di ideali.
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:41
Mercoledì, 13/04/2011
1. Perche' se non le inizializzi lasci al compilatore il compito di settare un valore di default, che se hai fortuna sara' zero, ma non ci contare sempre...

3. Ah ecco. C'e' qualche testo che supporta la tua soluzione? Guarda il 2's complement invece... http://academic.evergreen.edu/projects/biophysics/technote ...

Ultima modifica effettuata da pierotofy il 13/04/2011 alle 16:48


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
mycronapoli (Normal User)
Newbie


Messaggi: 17
Iscritto: 28/01/2011

Segnala al moderatore
Postato alle 17:59
Mercoledì, 13/04/2011
Testo quotato

Postato originariamente da pierotofy:

3. Ah ecco. C'e' qualche testo che supporta la tua soluzione? Guarda il 2's complement invece... http://academic.evergreen.edu/projects/biophysics/technote ...



Volevo farne a meno del complemento a 2... ma ok.. penso che farò così e il prof si attacca al tram :rotfl: ;)
Grazie mille Piero!Gentilissimo! :D


Abbiamo bisogno di idee, non di ideali.
PM Quote
Avatar
Peppe91 (Member)
Rookie


Messaggi: 41
Iscritto: 09/04/2011

Segnala al moderatore
Postato alle 15:19
Giovedì, 14/04/2011
Quoto Piero, devi inizializzare le variabili. Anche io ho fatto lo stesso esercizio. La function di sottrazione l'ho impostata così: op_1 e op_2 sono gli operandi in ingresso, che ti consiglio per una questione di spreco di memoria, di non dichiararli int ma short. Prima effettui lo xor fra i due operandi, esegui il not bitwise del primo operando (lo complementi in pratica). Fai la and fra i due operandi, e uno shift a sinistra. Ed ecco tutto. Buona programmazione!


short bin_sub (short op_1, short op_2)
{
    short sub=0, prestito=1;
    while (prestito!=0)
    {
        sub=op_1^op_2;
        op_1 = ~op_1;
        prestito = op_1&op_2;
        prestito=prestito<<1;
        op_1=sub;
        op_2=prestito;
    }
    return op_1;
}


Giuseppe
PM Quote
Avatar
mycronapoli (Normal User)
Newbie


Messaggi: 17
Iscritto: 28/01/2011

Segnala al moderatore
Postato alle 22:20
Giovedì, 14/04/2011
Grazie mille!!!
Non facevo lo shift!
Grazie davvero peppe91!!!!:D:D


Abbiamo bisogno di idee, non di ideali.
PM Quote
Avatar
Peppe91 (Member)
Rookie


Messaggi: 41
Iscritto: 09/04/2011

Segnala al moderatore
Postato alle 23:42
Giovedì, 14/04/2011
Di niente. Lo shift è fondamentale perchè non si parla più di riporto (come per la somma,dove serve sempre lo shift) ma di prestito. Il prestito deve sempre essere shiftato per non essere perso. Sennò perdi informazioni e si sballa tutto!


Giuseppe
PM Quote
Avatar
mycronapoli (Normal User)
Newbie


Messaggi: 17
Iscritto: 28/01/2011

Segnala al moderatore
Postato alle 11:57
Venerdì, 15/04/2011
L'avevo proprio dimenticato! Cioè l'avevo fatto per l'addizione, ma per la sottrazione l'ho proprio dimenticato!
;)


Abbiamo bisogno di idee, non di ideali.
PM Quote