Accendere l'i-esimo bit di un char

di il
6 risposte

Accendere l'i-esimo bit di un char

Ciao a tutti.. qualcuno sa dirmi come accendere l'i-esimo bit di una variabile di tipo char??

grazie a tutti per le vostre risposte...

6 Risposte

  • Re: Accendere l'i-esimo bit di un char

    Per accendere, intendi portarlo a 1?
    Se si, prova così:
    void accendere(char * a,int i){
     char tmp = 0;
    
     if ((i>=0) && (i<=15)) tmp = pow(2,i);
     else {
      fprintf(stderr,"posizione i non valida\n");
      exit(1);
     }
    
     if((*a & tmp) == 0) *a += tmp; //il bit i-esimo era a zero
    
    }
  • Re: Accendere l'i-esimo bit di un char

    Grazie per il tuo interessamento al mio problema.. ho provato il tuo codice ma non funziona.. cmq ho risolto il problema.. per chi fosse interessato posto il codice:
    
    void accendi_bit(char * c, int pos){
    	
    	*c =  *c | (0x01 << pos);
    	
    }
    
    int main(){
    
            char a = 'a';
            accendi_bit(&a, 0);
    
    }
    
    il codice sopradescritto accende il primo bit del contenuto della variabile a..

    saluti...
  • Re: Accendere l'i-esimo bit di un char

    Ciao,

    Una versione decisamente più veloce (il primo bit è il numero 0):
    void accendere(char *a,int i){
       *a=(*a)|(1<<i);
    }
    
    void spengere(char *a,int i){
       *a=(*a)&(~(1<<i));
    }
    Edit: Ops, crossposting... hai risolto da solo a quanto vedo

    Ciaociao
  • Re: Accendere l'i-esimo bit di un char

    La soluzione che ti avevo postato non l'avevo provata, cmq la vostra è nettamente migliore
  • Re: Accendere l'i-esimo bit di un char

    Ciao bottomap.. grazie per aver postato anche il codice per spegnere il bit in un solo colpo.. io cmq avevo risolto in un altro modo:
    
    int get_bit(char c, int pos){
    	
    	int nbit;
    	
    	nbit = (c & (0x01 << pos));
    	
    	if (nbit == 0){
    		
    		return 0;
    		
    	}else{
    		
    		return 1;
    		
    	}
    	
    }
    
    void accendi_bit(char * c, int pos){
    	
    	*c =  *c | (0x01 << pos);
    	
    }
    
    
    void spegni_bit(char * c, int pos){
    	
    	if (get_bit(*c, pos) == 1){
    		
    		*c = *c ^ (0x01 << pos);
    		
    	}
    	
    }
    
    almeno ora c'è un post on-line che parla in modo chiaro delle operazioni atomiche sui bit.. prima di fare il post qua avevo cercato in giro con scarsi rsultati..

    saluti...
  • Re: Accendere l'i-esimo bit di un char

    Ciao,
    La spegni bit che hai implementato è errata... se effettui un'operazione di xor (^) non ottieni il risultato sperato...

    per i bit a zero nella maschera avrai il risultato voluto (il bit originario rimane zero o uno), ma per il bit ad uno avrai che:
    1) Se era 0, viene impostato... ossia diventa 1
    2) Se era 1, viene azzerato, ossia produce il risultato voluto
    Il codice che hai proposto, pertanto si comporta bene solo se il bit corrispondente a quello impostato nella maschera non è zero, altrimenti ottieni di "accenderlo".

    In sostanza, per fare un esempio:
    0011 ^ 0001 = 0010 (corretto)
    Ma:
    0010 ^ 0001 = 0011 (errato, secondo quello che volevi ottenere)
    L'unico sistema "veloce" per resettare un bit è l' and con il not della maschera... in alternativa si può impostare la maschera a 0xFFFFFFFE e spostare quella, ma non con la normale operazione di shift <<, che introduce zeri a destra... si dovrebbe ricorrere ad una ror (mi pare che esista nella libreria standard, ma non è una funzione molto usata, visto che alla fine è comunque più veloce un & e ~)

    Ciaociao
Devi accedere o registrarti per scrivere nel forum
6 risposte