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++ - problema con esercizio addizione binaria
Forum - C/C++ - problema con esercizio addizione binaria

Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 9:51
Lunedì, 23/04/2012
salve ragazzi ho un problema con un esercizio..sull'addizione binaria.
l'addizione va fatta su int (dunque 32bit)
considerando solo gli 8 bit meno significativi.
Il risultato è un int dove gli 8 bit meno significativi contengono la somma,
ed il 9° bit contiene l'eventuale riporto (carry) della somma.

int wordAdder( int X, int Y);
Sfrutta la funzione fullAdder, ritorna la somma binaria di X e Y, operandi
interi con segno da considerare a 8 bit. Nel bit successivo a MSB del
valore di ritorno (considerando 8 bit) memorizza il carry bit calcolato.

Ma i numeri devono avere il segno!
Dunque il problema è:
- se metto il segno nell'8° bit,
  la somma 83+98 dell'esempio non si può fare,
  perché andiamo oltre il numero massimo rappresentabile con 7 bit;
- se non metto il segno nell'8° bit, dove lo metto?
  nel 9° c'è già il carry!

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int fullAdder(int, int, int);
  4. int wordAdder(int, int);
  5. int mult(int, int);
  6.  
  7. int main() { // main di prova
  8.     int res = wordAdder(83, 98);
  9.     //printf("\n%d\n", (res>>8)&1);
  10.     if ((res >> 8)&1) {
  11.         res = res | -256;
  12.     }
  13.     printf("\n%d\n\n", res);
  14.  
  15.     res = wordAdder(12, -73);
  16.     //printf("\n%d\n", (res>>8)&1);
  17.     if ((res >> 8)&1) {
  18.         res = res | -256;
  19.     }
  20.     printf("\n%d\n", res);
  21.     return 0;
  22. }
  23.  
  24. int fullAdder(int A, int B, int Cin) {
  25.     unsigned a, b, c, Cout, S;
  26.     int R = 0;
  27.     a = A & 1; // a = primo bit di A
  28.     b = B & 1; // b = primo bit di B
  29.     c = Cin & 1; // c = primo bit di Cin
  30.  
  31.     if (!a) {
  32.         Cout = b&c; // cout=and(b,c)
  33.         S = b^c; // s=xor(b,c) al bit 0
  34.     } else {
  35.         Cout = b | c; // cout=or(b,c)
  36.         S = (b^c)^1; // s=xor( xor(b,c) , 1 ) al bit 0
  37.     }
  38.  
  39.     R = (Cout << 1) | S; // metto il carry al bit 1
  40.     return R;
  41. }
  42.  
  43. int wordAdder(int X, int Y) {
  44.     int i, x, y, t, c = 0, S = 0; // somma e carry inizializzati a 0
  45.     for (i = 0; i < 8; i++) {
  46.         x = X >> i;
  47.         y = Y >> i;
  48.         t = fullAdder(x, y, c);
  49.         S = S | ((t & 1) << i);
  50.         c = (t >> 1)&1; // carry, per la somma della prossima cifra
  51.     }
  52.     S = S | (c << 8); // aggiungo il carry nel bit 9
  53.     // da togliere: stampa il risultato in binario
  54.     for (i = 31; i >= 0; i--) {
  55.         printf("%d", (S >> i)&1);
  56.     }
  57.     printf("\n");
  58.    
  59.     return S;
  60. }



Qualcuno potrebbe aiutarmi per favore.


Bonny
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:36
Lunedì, 23/04/2012
La cosa importante è stabilire che tipo di dati utilizzi per la somma

sono dati binari puri (senza segno) ?

sono dati binari con segno (in complemento a due a 32 bit)?

Nel secondo caso, il segno è nell'ultimo bit, il bit 31


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 435
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 10:42
Lunedì, 23/04/2012
Risolto andava i < 32 nel ciclo.


Bonny
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:12
Lunedì, 23/04/2012
E il segno? Come funziona con il segno? Lavora con i valori negativi o no?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote