Operazioni booleane

di il
11 risposte

Operazioni booleane

Ciao a tutti, sempre io che rompo in cerca di aiuto.
Ho questo stralcio di codice del mio nuovo esercizio da fare

void fullAdder( int A, int B, int Cin, int *out){
 
 int i;
 dec2bin(A,a);
 dec2bin(B,b);
 dec2bin(Cin, cin);
 for(i=0;i<32;i++){
 ris[i]= (a[i]^B[i])^Cin[i];
  
 }
 bin2dec(out, ris)
 //printf("\n LA LORO SOMMA E': %d", out);
}
Devo creare un fulladder facendo lo xor logico tra due numeri e poi lo xor con cin che sta per carry (riporto). Una domanda: in questo caso devo fare la somma tra due numeri senza usare l'operatore +. Va bene tradurli in binario in un array e fare lo xor coem ho fatto io? la riga dove faccio lo xor mi da errore invalid type int(int)

11 Risposte

  • Re: Operazioni booleane

    Com'è la definizione delle variabili che non hai segnalato, più precisamente:
    a,b,cin e ris.
  • Re: Operazioni booleane

    int A, B, Cin, out;
    int a[32], b[32], cin[32];
    int ris;
    
  • Re: Operazioni booleane

    Se ris è int non esiste ris
  • Re: Operazioni booleane

    No scusa...avevo mandato il codice già modificato pensando di non dover usare array
    void fullAdder( int A, int B, int Cin, int *out){
     
     int i;
     dec2bin(A,a);
     dec2bin(B,b);
     dec2bin(Cin, cin);
     for(i=0;i<32;i++){
     ris[i]= (a[i]^b[i])^cin[i];
      
     }
     bin2dec(out, ris);
     printf("\n LA LORO SOMMA E': %d", out);
    }
    questo è sistemato. Pero mi si blocca il programma
  • Re: Operazioni booleane

    
    printf("\n LA LORO SOMMA E': %d", *out);
    
    si blocca il programma non dice niente, dove si blocca.
  • Re: Operazioni booleane

    Ho sistemato coem hai detto tu.
    Il programma mi scrive come risposta che la somma vale 1000......
    poi diche che il file smette di funzionare.

    Ti chiedo un altra cosa: dato che questa somma una volta che funziona deve poter gestire anche i numeri negativi, pensavo che dato un numero in input, controllo se è minore di 0 quindi negativo.
    Faccio il valore assoluto con abs e lo traduco in binario. Se poi è negativo faccio il complemento a 2 negando i bit e gli sommo 1. E poi dovrebbe funzionare. Ho avuto un idea giusta?
  • Re: Operazioni booleane

    L'idea è giusta si. Posta il listato completo che magari hai qualche errore che non vedi.
  • Re: Operazioni booleane

    Ho modificato il codice perchè rileggendo bene il testo dell'esercizio la somma deve essere fatta solo sul bit meno significativo di A B e C e mettere il risultato nell'intero puntato da out.
    Il riporto va nella posizione 1 di Cin.
    La funzione fullAdder devo poi usarla in wordAdder per fare la somma tra X e Y e memorizza nel bit meno significativo dell’intero puntato da out l’ultimo carry bit calcolato. Quindi dovrei fare un ciclo per sommare ogni bit spostandomi nell'array. Ma come lo imposto?
    #include <stdio.h>
    #include <stdlib.h>
    
    
    void fullAdder( int A, int B, int Cin, int *out);
    int wordAdder( int X, int Y, int *out);
    int mult(int X, int Y);
    void dec2bin(int data, int bitSeq[32]);
    void bin2dec( int *data, int bitSeq[32]);
    int A, B, Cin, ris;
    int a[32], b[32], cin[32];
    int out = 0;
    
    int main(){
    
    fullAdder(4,2,0,0);
    
    
    getchar(); 
       system("npause");
        return 0;
    
    }
    
    
    void fullAdder( int A, int B, int Cin, int *out){
     
     int i,nA,j,nB;
     if (A<0){
       nA=abs(A);
       dec2bin(nA,a);
       for (j=0;j<32;j++){
        a[j]=~a[j];
        }}
     else{
       dec2bin(A,a);}
       
       
     if (B<0){
       nB=abs(B);
       dec2bin(nB,B);
       for (j=0;j<32;j++){
        b[j]=~b[j];
        }}
     else{
       dec2bin(B,b);}
     
      dec2bin(Cin, cin);
     
     ris= (a[0]^b[0])^cin[0];
     if (ris=10){
     (*out)=0;
     cin[1]=1;}
     if (ris=11){
     (*out)=1;
     cin[1]=1;}
     
    }
    
    
    int wordAdder( int X, int Y, int *out){
     
     fullAdder(X,Y,0,0);
     
     
    }
    
    int mult(int X, int Y){
    
    }
    
    void dec2bin(int data, int bitSeq[32]){
       //indici dei for
        int i=0;
        int j=0;
        //variabile che contiene il resto
        int r=0;
        //scrive il numero in decimale
         printf("\n IL NUMERO %u",data );
         printf(" IN BINARIO : ");
        //controlla il resto della divisione per 2 e associa il valore
        //corrispondente
        for(i=0;i<32;i++){
            r=data%2;
            if (r==0)
               bitSeq[i]=0;
            else
               bitSeq[i]=1;
               data=data/2;
               }
                /*scrive il numero in binario
               for(j=31;j>-1;j--) 
            printf("%d",bitSeq[j]);*/
       }
       
    void bin2dec( int *data,  int bitSeq[32]){
         //indice del for
         int j=0;
        //scrive il numero in binario
        printf("\n IL NUMERO BINARIO: ");
        for(j=0;j<32;j++) {
        printf("%d",bitSeq[j]);}
         /*legge l'elemento dall'array e lo moltiplica per 2^indice
         for(j = 0; j < 32; j++){
         (*data) |= bitSeq[j] << (32 - (j+1));}*/
      
    }	     
  • Re: Operazioni booleane

    Il fatto di sommare ogni bit è virtuale in quanto tu hai due vettori di interi da sommare tra di loro. Quindi la somma sarà quella algebrica tenendo conto che 1 + 1 = 0 con riporto di 1. Insomma devi fare la somma binaria come se stessi lavorando con carta e penna.
  • Re: Operazioni booleane

    Però non posso usare il segno + per la somma quindi userò lo xor.
    Ma se in fullAdder devo sommare solo il bit meno significativo, come faccio ad impostare questa somma in modo da poter usare questa funzione in wordAdder per sommare l'intero numero?
  • Re: Operazioni booleane

    Poi ripensandoci nella parte della somma posso togliere il controllo se il risultato è 10 perchè lo xor darebbe 1 e mi rimarrebbe da controllare il car del riporto a 1. Va bene come ho scritto il codice?
Devi accedere o registrarti per scrivere nel forum
11 risposte