Newsgroup: it.comp.lang.c++
Titolo: SOMMA BINARIA

Ciao a tutti,
volendo fare un programma che iplementa l'algortmo per la moltiplicazione
fra numeri  binari, ho riscontrato delle difficoltà per quel che riguarda la
somma fra numeri binari. Come posso fare? Preferirei evitare l'uso di
operatori bit a bit se è possibile.
Grazie anticipatamente
Roberto

 operatori bit a bit se è possibile.
Somma fra numeri binari che significa? Usi bitset<>, unsigned in cui metti 
numeri in forma esadecimale, stringhe del tipo "1001010"?
Se usi il bitset, mi sembra supporti l'operatore +.
Se usi gli unsigned, a + b.
Se usi le stringhe (se devi fare, ad esempio: "1001" + "1010" = "10011") il 
discorso si fa più difficile. Puoi usare molti trucchetti: ti converti le 
stringhe in un numero intero, li sommi e converti il risultato in una 
stringa. Oppure sommi "a mano" le stringhe.
-- 
Andrea Bergia - studente          Linux Registred User #281550
Per favore non mandatemi allegati in Word o PowerPoint.
Si veda 
http://www.fsf.org/philosophy/no-word-attachments.html

 stringa. Oppure sommi "a mano" le stringhe.
devo fare proprio il tipo di somma cdi cui hai fatto un esempio e purtroppo
devo fare la somma senza usare alcuna conversione in intero.Devo riuscire a
sommare direttamente in binario!!!! BOHHHHHH!!
Grazie lo stesso
ciao

 evitare l'uso di operatori bit a bit se è possibile.
risposta banale: i numeri sono gia` rappresentati in binario, quindi per 
sommarli basta usare l'operatore + (allo stesso modo per moltiplicarli).
Per la risposta piu` completa bisognerebbe sapere perche` vuoi fare 
questo programma: a cosa ti serve?
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

Roberto ha scritto:

Ok ok... Allora, cerco di darti una mano con l'algoritmo in pseudo-codifica 
(quasi Python, a guardare bene :-)). Se poi non riesci a codificarlo chiedi 
di nuovo.
Allora, date due stringhe A e B di N caratteri (cifre binarie) di sicuro il 
risultato sarà al max N + 1 caratteri no? Allora ci creiamo una stringa R 
di N + 1 caratteri. Poi iniziamo a sommare partendo dal fondo. Per comodità 
immaginiamo di ribaltare le stringhe.
A = reverse (A)
B = reverse (B)
# a questo punto sommiamo
riporto = 0
for i = 0 to len (A):
        if A[i] == '0':
                na = 0
        else
                na = 1
        if B[i] == '0':
                nb = 0
        else
                nb = 1
        C [i] = na + nb + riporto
        if na + nb + riporto > 1:
                C [i] = C [i] - 2
                r = 1
C[N + 1] = r
C = reverse(C)
Dovrebbe funzionare ad occhio, ma non sono sicuro. Se non ribalti le 
stringhe gli indici anzichè essere crescenti, vanno da N - 1 a 0, che è più 
o meno la stessa cosa. Però mi piaceva di più così ;-) Spero di averti 
aiutato. Ciao.


 intero.Devo riuscire a sommare direttamente in binario!!!! BOHHHHHH!!
mi sembra che tu abbia un po' di confusione in testa: parli di "interi" e 
"binari" come se fossero due cose distinte: invece il formato binario e` 
solo un modo particolare di rappresentare i numeri interi (e non solo 
quelli).
Partiamo dall'inizio:
1) perche` devi fare questo programma?
2) quali sono i dati di input? In che formato? (stringa binaria, numero 
decimale, ecc.)
3) Come rappresenti i dati all'interno del tuo programma? Usi delle 
variabili di tipo int? Usi std::bitset? Usi una stringa?


 variabili di tipo int? Usi std::bitset? Usi una stringa?
Uso una stringa
Grazie per il tempo che mi stai dedicando
Ciao

 di nuovo.
infatti, non l'ho capito bene :( potresti postarmi direttamente il codice
(magari con qualche commento) sempre che ciò non sia di troppo disturbo??
Grazie anticipatamente (anche nel caso di risposta negativa)
Ciao
Roberto

 Grazie anticipatamente (anche nel caso di risposta negativa)
Ok.
<code>
#include <string>
using namespace std;
int main ()
{
        string a, b;
        cout << "Inserisci due numeri binari: ";
        cin >> a >> b;
        /* Suppongo che l'input sia sempre corretto, meglio se aggiu
ngi un controllo che la stringa contenga solo '1' e '0' e che le due st
ringhe siano lunghe uguali */
        int rip = 0, na, nb;
        string c (a.size() + 1, ' ');
        for (int i = a.size() - 1; i >= 0; --i) {
                // Converto a[i] in una cifra binaria -> 0 o 1
                if (a[i] == '0')
                        na = 0;
                else
                        na = 1;
                // Converto b[i] in una cifra binaria -> 0 o 1
                if (b[i] == '0')
                        nb = 0;
                else
                        nb = 1;
                /* Otterrò un numero 0 <= n <= 3, ma io devo convertirlo
 in carattere perciò ci aggiungo '0' */
                c[i + 1] = na + nb + rip + '0';
                if (na + nb + rip > 1) {
                        /* Abbiamo ottenuto 2 o 3: attiviamo il riporto per la prossima cifra */
                        rip = 1;
                        c[i + 1] -= 2;
                } else
                        /* Nessun riporto */
                        rip = 0;
        }
        c [0] = rip + '0';
 
        cout << a << " + " << b << " = " << c << endl;
 
        return 0;
}
</code>
L'algoritmo non è il più bello del mondo, ma funziona. Attento agli errori 
sull'input. Se riesci a capirlo bene prova a supportare numeri di lunghezza 
diversa (suggerimento: rendi il minore lungo quanto il maggiore). 
Altrimenti chiedi pure, siamo qui per questo. Ciao :-)


 Uso una stringa
bene, allora ti dico che IMHO non e` la struttura dati piu` appropriata: 
penso che potresti dare un'occhiata a std::bitset oppure ad un piu` 
semplice array (o, meglio, std::vector) di bool.
Cmq indipendentemente dalla rappresentazione l'algoritmo da adottare e` 
lo stesso che si usa per fare la "somma in colonna" con i numeri 
decimali; di seguito di mostro uno pseudocodice che gestisce tutti i 
casi possibili: probabilmente e` possibile semplificarlo, pero` IMHO 
cosi` e` piu` facile da capire cosa succede:
<con 'cifra1', 'cifra2', 'cifraR' intendo la cifra del primo addendo, 
secondo addendo, risultato>
riporto = 0
per ogni cifra a partire da destra:
        se riporto = 0:
                se cifra1 = 0 e cifra2 = 0:
                        cifraR = 0
                        riporto = 0
                altrimenti se cifra1 = 1 e cifra2 = 1:
                        cifraR = 0
                        riporto = 1
                altrimenti:
                        cifraR = 1
                        riporto = 0
        altrimenti se riporto = 1:
                se cifra1 = 0 e cifra2 = 0:
                        cifraR = 1
                        riporto = 0
                altrimenti se cifra1 = 1 e cifra2 = 1:
                        cifraR = 1
                        riporto = 1
                altirmenti:
                        cifraR = 0
                        riporto = 1
fine del ciclo for
A questo punto il numero composto dalle varie cifraR e` il risultato 
della somma. Nota che se quando esci dal ciclo for la variabile riporto 
e` impostata a "1" significa che sei andato in overflow (quindi se vuoi 
simulare una ALU dovresti probabilmente impostare il bit di overflow a 
1).


 dell'ALU quando è alle prese con la moltiplicazione
dimenticavo: non riguarda direttamente il tuo problema, pero` se sei 
interessato alla simulazione di macchine virtuali forse ti puo` essere 
utile il mio articolo "Un esempio di macchina virtuale: la macchina di 
Von Neumann", disponibile a partire da 
cpp.programmazione.it
