Accendere l'i-esimo bit di un char

di Anonimizzato649 il
6 risposte
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

  • 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
    
    }
  • 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...
  • 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
  • La soluzione che ti avevo postato non l'avevo provata, cmq la vostra è nettamente migliore
  • 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...
  • 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