Bin2dec e oct2dec

di il
13 risposte

Bin2dec e oct2dec

Ciao a tutti,
sono nuova di questo forum. Ho visto questo sito e spero mi veniate in aiuto.
Devo fare un esercizio con 4 funzioni: dec2bin (da decimale a binario), dec2oct (da decimale a ottale), bin2dec (da binario a decimale) e oct2 dec (da ottale a decimale).
Le prime due sono riuscita a farle ma mi sono trovata davanti ad un muro con la bin2dec e di conseguenza dovendo affrontare ancora da oct2dec sarà uguale.
void bin2dec(unsigned int *data, short int bitSeq[32]){
    
    int j=0;
    int i=-1;
    numero=&ris;
    ris=0;
    unsigned int temp;
     printf("\n IL NUMERO BINARIO: ");
    for(j=0;j<32;j++) {
    printf("%d",bitSeq[j]);}
          if (bitSeq[0]==1){
          printf ("1");}
        
}	     
           
il problema è che nell'elevamento a potenza non posso usare pow e non riesco ad uscirne.
Devo consegnarlo entro domenica. Riuscireste a darmi una dritta? Lo so che il tempo è poco ma credo che non sia difficile per un veternao del C. Io purtroppo sono molto arrugginita.
Grazie

13 Risposte

  • Re: Bin2dec e oct2dec

    Questo ti va bene?
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    void bin2dec(unsigned int *data, const short bitSeq[32])
    {
    	int j=0;
    
    	for(j = 0; j < 32; j++)
    		(*data) |= bitSeq[j] << (32 - (j+1));
    }        
    
    int main()
    {
    	unsigned int data = 0;
    	//95227 in binario
    	const short bitSeq[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,0,1,1};
    	bin2dec(&data,bitSeq);
    	printf("%d",data);
    }
    
    Puoi usare il shift a sx?
  • Re: Bin2dec e oct2dec

    Si posso usarlo.
    Funziona il tuo listato ma se lo metto nel mio no.
    Nel senso che devo fare 5 chiamate alla funzione quindi il codice di stampa l'ho messo nella funzione ma richiamandola torna sempre lo stesso numero.
  • Re: Bin2dec e oct2dec

    Posta il tuo codice allora
  • Re: Bin2dec e oct2dec

    Questo è il codice completo con tutte le funzioni.
    Se mi funziona da bin2dec immagino di far presto a fare la oct2dec
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    
    void dec2bin(unsigned int data, short int bitSeq[32]);
    void bin2dec(unsigned int *data, short int bitSeq[32]);
    void dec2oct(unsigned int data, short int octSeq[11]);
    //void oct2dec(unsigned int *data, short int octSeq[11]);
    
    
     short int bitSeq[32];
     short int octSeq[11];
     short int a[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1};
     short int b[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0};
     short int c[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1};
     short int d[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0};
     short int e[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
     
    
    int main(){
    
     
     
      /*printf("\n DEC2BIN\n"); 
      dec2bin(7,bitSeq);
      dec2bin(32,bitSeq);
      dec2bin(70,bitSeq);
      dec2bin(153,bitSeq);
      dec2bin(52150,bitSeq);
      
      printf("\n\n\n DEC2OCT\n");
      dec2oct(8,octSeq);
      dec2oct(35,octSeq);
      dec2oct(124,octSeq);
      dec2oct(888,octSeq);
      dec2oct(9625,octSeq);*/
      
      
      
      printf("\n\n\n BIN2DEC\n");
      unsigned int data = 0;
       
       bin2dec(&data,a);
       printf("\n IN DECIMALE :%d",data);
       bin2dec(&data, b);
       printf("\n IN DECIMALE :%d", data);
       bin2dec(&data, c);
       printf("\n IN DECIMALE :%d", data);
       bin2dec(&data, d);
       printf("\n IN DECIMALE :%d", data);
       bin2dec(&data, e);
       printf("\n IN DECIMALE :%d", data);
      
      
      getchar(); 
       system("npause");
        return 0;
    }
    
    void bin2dec(unsigned int *data, short int bitSeq[32]){
         int j=0;
         
         printf("\n IL NUMERO BINARIO: ");
        for(j=0;j<32;j++) {
        printf("%d",bitSeq[j]);}
         
          for(j = 0; j < 32; j++)
          (*data) |= bitSeq[j] << (32 - (j+1));
          
        
        
        
      
    }	     
               
            
        
       
        
       
    
    
    void dec2oct(unsigned int data, short int octSeq[11]){
       
        int i=0;
        int r=0;
        int j=0;
         printf("\n IL NUMERO %u",data );
         printf(" IN OTTALE : ");
        for(i=0;i<11;i++){
            r=data%8;
            if (r==0)
               octSeq[i]=0;
            if (r==1)
               octSeq[i]=1;
            if (r==2)
               octSeq[i]=2;
            if (r==3)
               octSeq[i]=3;
            if (r==4)
               octSeq[i]=4;
            if (r==5)
               octSeq[i]=5;
            if (r==6)
               octSeq[i]=6;
            if (r==7)
               octSeq[i]=7;        
            data=data/8;
               }
                
               for(j=10;j>-1;j--) 
            printf("%d",octSeq[j]);
       }
    
    void dec2bin(unsigned int data, short int bitSeq[32]){
       
        int i=0;
        int r=0;
        int j=0;
         printf("\n IL NUMERO %u",data );
         printf(" IN BINARIO : ");
        for(i=0;i<32;i++){
            r=data%2;
            if (r==0)
               bitSeq[i]=0;
            else
               bitSeq[i]=1;
               data=data/2;
               }
                
               for(j=31;j>-1;j--) 
            printf("%d",bitSeq[j]);
       }
       
  • Re: Bin2dec e oct2dec

    Devi azzerrare data ad ogni chiamata e vedrai che ti funziona.
    
    bin2dec(&data,a);
       printf("\n IN DECIMALE :%d",data);
    data = 0;
       bin2dec(&data, b);
       printf("\n IN DECIMALE :%d", data);
    data = 0;
       bin2dec(&data, c);
       printf("\n IN DECIMALE :%d", data);
    data = 0;
       bin2dec(&data, d);
       printf("\n IN DECIMALE :%d", data);
    data = 0;
       bin2dec(&data, e);
       printf("\n IN DECIMALE :%d", data);
    
  • Re: Bin2dec e oct2dec

    Grazie mille. Funziona!
    mi hai salvato dal primo esercizio.
    Spero di cavarmela nei prossimi e adesso mi cimento nella oct2dec
  • Re: Bin2dec e oct2dec

    Ma perchè non mi funziona la oct2dec???
    Scommetto che è un problema di puntatori. Dove posso trovare una guida che mi spieghi esattamente come funzionano i puntatori in modo da non avere dubbi? Grazie
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    
    void dec2bin(unsigned int data, short int bitSeq[32]);
    void bin2dec(unsigned int *data, short int bitSeq[32]);
    void dec2oct(unsigned int data, short int octSeq[11]);
    void oct2dec(unsigned int *data, short int octSeq[11]);
    
    
     short int bitSeq[32];
     short int octSeq[11];
     short int a[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1};
     short int b[]= {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
     short int c[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1};
     short int d[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1};
     short int e[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
     short int f[]= {0,0,0,0,0,0,0,0,7,2,5};
     short int g[]= {0,0,0,0,0,0,0,0,0,2,5};
     short int h[]= {0,0,0,0,0,0,0,0,1,2,5};
     short int i[]= {0,0,0,0,0,0,0,0,0,3,3};
     short int l[]= {0,0,0,0,0,0,0,0,0,1,2};
     
    
    int main(){
    
     
     
      /*printf("\n DEC2BIN\n"); 
      dec2bin(7,bitSeq);
      dec2bin(32,bitSeq);
      dec2bin(70,bitSeq);
      dec2bin(153,bitSeq);
      dec2bin(52150,bitSeq);
      
      printf("\n\n\n DEC2OCT\n");
      dec2oct(8,octSeq);
      dec2oct(35,octSeq);
      dec2oct(124,octSeq);
      dec2oct(888,octSeq);
      dec2oct(9625,octSeq);
      
      
      
      printf("\n\n\n BIN2DEC\n");*/
      unsigned int data = 0;
       
       /*bin2dec(&data,a);
       printf("\n IN DECIMALE :%d",data);
       data=0;
       bin2dec(&data, b);
       printf("\n IN DECIMALE :%d", data);
       data=0;
       bin2dec(&data, c);
       printf("\n IN DECIMALE :%d", data);
       data=0;
       bin2dec(&data, d);
       printf("\n IN DECIMALE :%d", data);
       data=0;
       bin2dec(&data, e);
       printf("\n IN DECIMALE :%d", data);
       data=0;*/
       
       
       printf("\n\n\n OCT2DEC\n");
       oct2dec(&data, f);
       printf("\n IN DECIMALE :%d",data);
       data=0;
      /* oct2dec(&data, g);
       printf("\n IN DECIMALE :%d", data);
       data=0;
       oct2dec(&data, h);
       printf("\n IN DECIMALE :%d", data);
       data=0;
       oct2dec(&data, i);
       printf("\n IN DECIMALE :%d", data);
       data=0;
       oct2dec(&data, l);
       printf("\n IN DECIMALE :%d", data);
       data=0;*/
      
      
      getchar(); 
       system("npause");
        return 0;
    }
    
    void oct2dec(unsigned int *data, short int octSeq[11]){
        
        int j;
        unsigned int n;
        printf("\n IL NUMERO OTTALE: ");
        for(j=0;j<11;j++) {
        printf("%d",octSeq[j]);}
         
        for(j = 0; j < 11; j++){
        n=octSeq[j];
        (*data) = (*data)+ n << (3*octSeq[j]);
        }
        
    
    
    /*int n,r,i;
     n=oct;
     oct=0;
     for(i=0;n!=0;i++)
     {
     r=n%10;
     oct=oct+r*poww(8,i);
     n=n/10;
     }
     return oct;*/
    
    }
    void bin2dec(unsigned int *data, short int bitSeq[32]){
         int j=0;
         
         printf("\n IL NUMERO BINARIO: ");
        for(j=0;j<32;j++) {
        printf("%d",bitSeq[j]);}
         
          for(j = 0; j < 32; j++){
          (*data) |= bitSeq[j] << (32 - (j+1));}
      
    }	     
               
     
    void dec2oct(unsigned int data, short int octSeq[11]){
       
        int i=0;
        int r=0;
        int j=0;
         printf("\n IL NUMERO %u",data );
         printf(" IN OTTALE : ");
        for(i=0;i<11;i++){
            r=data%8;
            if (r==0)
               octSeq[i]=0;
            if (r==1)
               octSeq[i]=1;
            if (r==2)
               octSeq[i]=2;
            if (r==3)
               octSeq[i]=3;
            if (r==4)
               octSeq[i]=4;
            if (r==5)
               octSeq[i]=5;
            if (r==6)
               octSeq[i]=6;
            if (r==7)
               octSeq[i]=7;        
            data=data/8;
               }
                
               for(j=10;j>-1;j--) 
            printf("%d",octSeq[j]);
       }
    
    void dec2bin(unsigned int data, short int bitSeq[32]){
       
        int i=0;
        int r=0;
        int j=0;
         printf("\n IL NUMERO %u",data );
         printf(" IN BINARIO : ");
        for(i=0;i<32;i++){
            r=data%2;
            if (r==0)
               bitSeq[i]=0;
            else
               bitSeq[i]=1;
               data=data/2;
               }
                
               for(j=31;j>-1;j--) 
            printf("%d",bitSeq[j]);
       }
       
  • Re: Bin2dec e oct2dec

    
    dec2oct(8,octSeq);
    
    dec2oct accetta un puntatore tu li passi un valore. Guarda l'esempio del bin2dec dove passi un puntatore ad una variabile.
  • Re: Bin2dec e oct2dec

    La dec2oct mi funziona. E' la oct2dec che non va.
    La traduzione in decimale viene fatta tra un array che contiene il numero in ottale e il risultato va messo in data.
    La dec2oct funziona
  • Re: Bin2dec e oct2dec

    Mi puoi solo spiegare esattamente cosa significa |=
    Grazie
  • Re: Bin2dec e oct2dec

    emyjumpy ha scritto:


    La dec2oct mi funziona. E' la oct2dec che non va.
    La traduzione in decimale viene fatta tra un array che contiene il numero in ottale e il risultato va messo in data.
    La dec2oct funziona
    Errore mio leggevo una cosa per un altra.
    
    (*data) |= ...... equivale a:
    
    (*data) = (*data) | (......)
    
    leggì su OR tra bit quì:
    http://it.wikipedia.org/wiki/Algebra_di_Boole#O
  • Re: Bin2dec e oct2dec

    Risposta alla tua domanda di prima. Si procede con lo stesso raggionamento del bin ma siccome 8 = 2 ^ 3 devi moltiplicare tutto per 3.
    
    #include <stdio.h>
    
    void oct2dec(unsigned long *data, const short octSeq[32])
    {
    	int j=0;
    
    	for(j = 0; j < 11; j++)
    		(*data) |= octSeq[j] << (3 * (11 - (j+1)));
    }        
    
    int main()
    {
    	unsigned long data = 0;
    	//95227 in ottale
    	const short octSeq[] = {0,0,0,0,0,2,7,1,7,7,3};
    	oct2dec(&data,octSeq);
    	printf("%d",data);
    }
    
  • Re: Bin2dec e oct2dec

    Grazie mille. Purtroppo ho spedito tutto con quell'errore.
    Spero di rifarmi con l'esercizio di questa settimana sul fulladder
    Grazie veramente dei consigli
Devi accedere o registrarti per scrivere nel forum
13 risposte