Estrarre n bit in un numero quasiasi

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Estrarre n bit in un numero quasiasi

    Comunque questo è il mio algoritmo di risoluzione non è ancora ben ottimizzato ma presumo funzioni
    
    
    int setbits(int x,int y,int n,int p)
    {
        int i,mask,second_mask,app,copiax,ris2;
        
        
        mask=second_mask=0;
        
        
        copiax=x;// mi serve per non perdere gli altri bit che non verranno modificati    11.1011.10
        app=0;                                                                         // 00.1111.00
                                                                                        //    00.1011.00
        
        for(i=0;i<n;++i)
            mask|=(1<<p+i);    // creo la maschera shiftata già in posizione giusta 
            
            
                                                                                            //10.0111.00   &
                                                                                            //00.0000.00
    
    
        app=mask&y;// estrapolo i bit che mi interessano di y;
        
        
        for(i=0;i<n;i++)
            second_mask|=(0<<p+i);
        
        
            
        ris2=second_mask&x;
        ris2=ris2|app;
        
        ris2=ris2|x;
    
    
        return ris2;
    
    
    }
  • Re: Estrarre n bit in un numero quasiasi

    1) non hai visto il codice che ti ho sottoposto

    2) non hai risposto alla domanda che ti ho fatto in quell'occasione

    3) non si capisce assolutamente il ragionamento che hai fatto né il codice che hai proposto (in particolare fare uno shift di 0<< non significa nulla)

    Mi dispiace ma non posso impegnare molto tempo nelle risposte, specialmente se non vengono neanche prese in considerazione ...
  • Re: Estrarre n bit in un numero quasiasi

    Scusa ma hai creato una maschera e volevo solo farti vedere come l'avevo pensata io la creazione di una maschera... per quando riguarda la domanda credevo di averti risposto con l'esempio fatto prima. Mi hai chiesto di spiegare meglio la seconda parte dell'esercizio e io con un esempio ho tentato di farti capire, dopo aver creato una maschera ed estrapolato n bit dalla posizione p in poi dal numero y devono essere sostituiti a quelli del numero x se non ho capito oppure ho saltato qualcosa dimmi pure... se vuoi proverò a commentare il mio codice in modo migliore così da spiegare meglio...
  • Re: Estrarre n bit in un numero quasiasi

    
    
    #include <stdio.h>
    
    
    int setbits(int x, int y,int n,int p);
    
    int main(void)
    {
        
        int x,y,n,p,ris;
        
        
        printf("inderisci il primo numero\n");
        scanf("%d",&x);
        
        
        printf("inserisci il secondo numero\n");
        scanf("%d",&y);
        
        printf("quanti bit devo modificare dal primo numero?\n");
        scanf("%d",&n);
        
        printf("da che bit devo cominciare??\n");
        scanf("%d",&p);
        
        
        ris=setbits(x,y,n,p);
        
        printf("risultato finale : %d\n",ris);
        
        return 0;
    }
    
    
    
    
    int setbits(int x,int y,int n,int p)
    {
        int i,mask,second_mask,app,copiax,ris2;
        
        
        mask=second_mask=0;
        
        
        copiax=x;// mi serve per non perdere gli altri bit che non verranno modificati    
        app=0;                                                                         
                                                                                    
        
        for(i=0;i<n;++i)
            mask|=(1<<p+i);    // creo la maschera shiftata già in posizione giusta 
                             // esempio devo estrapolare 3 bit partendo dal secondo bit? produrrà 11100
            
                                                       
                                                                                    
    
    
        app=mask&y;// estrapolo i bit che mi interessano di y;         salvo solo i bit che mi servono
        
       
      //  for(i=0;i<n;i++)      operazione che tu hai detto essere inutile io l'avevo pensata perché credevo che altrimenti potevo incorrere in problemi
       //     second_mask|=(0<<p+i);
        
        
            
        ris2=second_mask&x;  // azzero ris 2 mettendo tutto in & con 0
        ris2=ris2|app;       // adesso ris2 contiene app(ricordando che app contiene i bit estrapolati da y
        
        ris2=ris2|x;       // adesso devo riattaccare i bit che c'erano prima e dopo quelli modificati
    
    
        return ris2; // una volta finito restituisco tutto al mittente 
    
    
    }
    
    ti ho voluto proporre il mio modo di creare questa maschera per il semplice motivo che il mio professore tramite email mi ha proposto a me questo metodo per crearla
  • Re: Estrarre n bit in un numero quasiasi

    Ciao broke31, (ciao oregon),
    giusto per giocare un po' ti propongo questa soluzione che non fa uso di cicli.
    
    #include<iostream>
    using namespace std;
    
    unsigned int SetBits(int x, int y, int n, int p)
    {
    	int m = (1 << n) - 1;
    	return (x & ~(m << p - n)) | ((y & m) << p - n);
    }
    
    int main()
    {
    	int n = 4;
    	int p = 6;
    
    	int x = 161; // 10 1000 01
    	int y = 6;   // 0000 [0110]
    
    	int result = SetBits(x, y, n, p); // risulta 153   10 [0110] 01
    
    	cout << result << endl;
    }
    
    
    È un pò criptica ma ha il suo fascino.
    La chiave per capirla è nel suggerimento di oregon, guardalo con calma.
  • Re: Estrarre n bit in un numero quasiasi

    Umh devo vederla con calma ma grazie cara tutti e2 per le risposte
  • Re: Estrarre n bit in un numero quasiasi

    Ciao broke31,
    ti avevo detto che stavo giocando, e so bene che la soluzione che ti ho dato è incomprensibile.

    Appena ti sei stufato di guardarla ti do tutte le spiegazioni del caso.
Devi accedere o registrarti per scrivere nel forum
21 risposte