Algoritmi C/C++

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++

C
Esegui →
main.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);
}
Risultato dell'esecuzione
flags=8 bit3=1
C++
Esegui →
main.cpp
#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';
}
Risultato dell'esecuzione
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.

C

Cicli, puntatori, lunghezze e buffer temporanei sono scritti esplicitamente.

C++

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.

Tutte le sfide