La manipolazione dei bit in C e C++
In questa lezione accenderai, spegnerai, invertirai e controllerai i singoli bit di un intero per memorizzare più stati acceso/spento.
Introduzione
Ogni bit di un intero può contenere un valore vero o falso. Così un solo intero senza segno può memorizzare più opzioni acceso/spento indipendenti, chiamate flag. Questa tecnica delle maschere di bit (bit mask) è molto comune nella programmazione di sistema e nei sistemi embedded.
Punti importanti
- Prova con input vuoti, con un solo elemento, con valori ripetuti e già ordinati.
- Prima fai funzionare il codice correttamente, poi ottimizza.
- Nel codice reale preferisci le funzioni pronte della libreria standard.
Esempi di codice C e C++
#include <stdio.h>
int main(void) {
unsigned flags = 0;
flags |= 1u << 1;
flags |= 1u << 3;
flags ^= 1u << 1;
printf("flags=%u bit3=%u\n", flags, (flags >> 3) & 1u);
}
flags=8 bit3=1
#include <bitset>
#include <iostream>
int main() {
std::bitset<4> flags;
flags.set(1);
flags.set(3);
flags.flip(1);
std::cout << "flags=" << flags
<< " bit3=" << flags.test(3) << '\n';
}
flags=1000 bit3=1
Confronto tra C e C++
L'espressione 1u << n crea un numero con il solo bit n uguale a 1. L'operatore |= accende il bit, ^= lo inverte, e (flags >> 3) & 1u controlla il bit 3. Dopo aver acceso i bit 1 e 3 e aver invertito di nuovo il bit 1, resta acceso solo il bit 3, quindi flags vale 8. Preferisci i tipi senza segno (unsigned) perché gli spostamenti di bit diano risultati prevedibili. In C++, std::bitset offre metodi chiari come set() e flip() e stampa il valore in binario.
Cicli, puntatori, lunghezze e buffer temporanei sono scritti esplicitamente.
Iteratori e algoritmi standard separano l'elaborazione dal modo in cui i dati sono memorizzati.
Esercizi di approfondimento
Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.
- Simula ogni confronto su carta.
- Prova con valori ripetuti e con valori molto grandi e molto piccoli.
- Misura il tempo del tuo codice e confrontalo con la libreria standard.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Potenza di due Verifica se un numero è una potenza di due. Facile
- Numero Minimo di Corse in Ascensore Raggruppa le persone nel minor numero possibile di corse in ascensore, rispettando il limite di peso. Difficile