Bonny (Member)
Expert
Messaggi: 437
Iscritto: 24/04/2009
|
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++ |
#include <stdio.h> int fullAdder(int, int, int); int wordAdder(int, int); int mult(int, int); int main() { // main di prova int res = wordAdder(83, 98); //printf("\n%d\n", (res>>8)&1); if ((res >> 8)&1) { res = res | -256; } printf("\n%d\n\n", res); res = wordAdder(12, -73); //printf("\n%d\n", (res>>8)&1); if ((res >> 8)&1) { res = res | -256; } printf("\n%d\n", res); return 0; } int fullAdder(int A, int B, int Cin) { unsigned a, b, c, Cout, S; int R = 0; a = A & 1; // a = primo bit di A b = B & 1; // b = primo bit di B c = Cin & 1; // c = primo bit di Cin if (!a) { Cout = b&c; // cout=and(b,c) S = b^c; // s=xor(b,c) al bit 0 } else { Cout = b | c; // cout=or(b,c) S = (b^c)^1; // s=xor( xor(b,c) , 1 ) al bit 0 } R = (Cout << 1) | S; // metto il carry al bit 1 return R; } int wordAdder(int X, int Y) { int i, x, y, t, c = 0, S = 0; // somma e carry inizializzati a 0 for (i = 0; i < 8; i++) { x = X >> i; y = Y >> i; t = fullAdder(x, y, c); S = S | ((t & 1) << i); c = (t >> 1)&1; // carry, per la somma della prossima cifra } S = S | (c << 8); // aggiungo il carry nel bit 9 // da togliere: stampa il risultato in binario for (i = 31; i >= 0; i--) { printf("%d", (S >> i)&1); } printf("\n"); return S; }
|
Qualcuno potrebbe aiutarmi per favore.
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |