View Full Version : Puntatori a bit
Salve ragazzi,
vi pongo una domanda: in C++ è possibile far puntare un puntatore, che generalmente punta al byte, ad un singolo bit che compone tale byte? Vi faccio un'esempio:
Supponiamo che in un byte ho memorizzato il codice 11010111 . Voglio cambiare il primo bit, quindi faccio una maschera del tipo 01111111 e poi faccio l'AND tra la maschera ed il codice. Ma è possibile dire al puntatore a quel byte, puntami al primo bit e scrivimi 0?
no, non si può perché l'unità di indirizzamento è il byte, e questo non dipende dal linguaggio usato (C++ nel tuo caso), ma dalla macchina su cui lavori: nessun computer ti fa indirizzare singoli bit :)
no, non si può perché l'unità di indirizzamento è il byte, e questo non dipende dal linguaggio usato (C++ nel tuo caso), ma dalla macchina su cui lavori: nessun computer ti fa indirizzare singoli bit :)
Quindi l'unico modo è usare le maschere? Pero' in questo modo non operiamo realmente sul singolo bit. Chissà come mai non hanno implementato una cosa del genere.Forse perchè è impossibile.Ciao, grazie. :)
Ziosilvio
21-07-2005, 20:32
Salve ragazzi,
vi pongo una domanda: in C++ è possibile far puntare un puntatore, che generalmente punta al byte, ad un singolo bit che compone tale byte?
No: i puntatori lavorano su oggetti che occupano un numero intero di byte.
Però puoi usare le maschere e gli operatori bit-a-bit.
Supponiamo che in un byte ho memorizzato il codice 11010111 . Voglio cambiare il primo bit, quindi faccio una maschera del tipo 01111111
Casomai, del tipo "11111110": i bit si contano a partire dal meno significativo, cioè da quello più a destra.
e poi faccio l'AND tra la maschera ed il codice.
Se vuoi cambiare il valore di un bit, cioè metterlo a 1 se è 0 e a 0 se è 1, devi fare non un AND ma uno XOR, e mettendo 1 in corrispondenza dei bit che vuoi cambiare, e 0 in corrispondenza degli altri.
Nel tuo caso:
mybyte ^= 0x1;
Ma è possibile dire al puntatore a quel byte, puntami al primo bit e scrivimi 0?
Al puntatore no, ma al bit scelto ovviamente sì: basta fare un AND con la maschera complementare.
Per esempio, se vuoi mettere a 0 il byte di indice 3 (gli indici partono da 0) e lasciare invariati gli altri, puoi fare:
mybtyte &= ~(0x8);
Pero' in questo modo non operiamo realmente sul singolo bit.
Perché no?
Il bit cambia, gli altri rimangono immutati: come fai a dire che non si è operato sul singolo bit?
Chissà come mai non hanno implementato una cosa del genere.Forse perchè è impossibile.
Casomai, perché sarebbe scomodo.
Pensaci un attimo: se dovessi essere in grado di indirizzare ogni singolo bit della memoria anziché ogni singolo byte, ti ci vorrebbero dei puntatori otto volte più grandi, e potresti allocare 256 volte meno memoria.
Casomai, del tipo "11111110": i bit si contano a partire dal meno significativo, cioè da quello più a destra.
Hai ragione, intendevo dire il bit piu' significativo :)
Se vuoi cambiare il valore di un bit, cioè metterlo a 1 se è 0 e a 0 se è 1, devi fare non un AND ma uno XOR, e mettendo 1 in corrispondenza dei bit che vuoi cambiare, e 0 in corrispondenza degli altri.
Nel tuo caso:
mybyte ^= 0x1;
Verissimo, ho fatto un po' di confusione
Perché no?
Il bit cambia, gli altri rimangono immutati: come fai a dire che non si è operato sul singolo bit?
Intendevo dire, che comunque l'operazione logica è fatta su tutti i bit, non solamente su quello che devo cambiare.In pratica, non esiste un'operatore che mi fa operare sul singolo bit.
Casomai, perché sarebbe scomodo.
Pensaci un attimo: se dovessi essere in grado di indirizzare ogni singolo bit della memoria anziché ogni singolo byte, ti ci vorrebbero dei puntatori otto volte più grandi, e potresti allocare 256 volte meno memoria.
Pero' in qualche caso potrebbe fare comodo, perchè comunque devo crearmi maschere di 8 bit per modificarne uno. Non so in termini computazionali quele sia meglio. Sicuramente le maschere, altrimenti non le facevano.
PS: Stai diventando il mio punto di riferimento in questo forum. :)
Intendevo dire, che comunque l'operazione logica è fatta su tutti i bit, non solamente su quello che devo cambiare.In pratica, non esiste un'operatore che mi fa operare sul singolo bit. lascia perdere il linguaggio C++: nessuna macchina è in grado di lavorare su un solo bit alla volta; gli Intel ad es. devono per forza lavorare almeno su byte di 8 bit, ed è così anche per molte altre.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.