Tutti gli articoli

Operazioni bit a bit: come funzionano AND, OR e XOR a livello di bit

Nei permessi dei file Unix, il comando chmod 640 non è altro che logica bit a bit applicata a tre gruppi di tre bit: lettura, scrittura ed esecuzione per proprietario, gruppo e altri, combinati con OR in un'unica cifra ottale. Verificare se un permesso specifico è attivo è un semplice AND con la maschera giusta.

AND, OR, XOR, NOT — le quattro operazioni di base

  • AND (&) — il bit risultante è 1 solo se entrambi i bit di ingresso sono 1. Serve a verificare se un permesso specifico è impostato in una maschera.
  • OR (|) — il bit risultante è 1 se almeno uno dei bit di ingresso è 1. Serve a combinare più permessi in un unico valore.
  • XOR (^) — il bit risultante è 1 se i bit di ingresso sono diversi; applicare XOR due volte con lo stesso valore restituisce l'originale.
  • NOT (~) — inverte ogni bit di un numero.

In cosa l'AND bit a bit differisce da quello logico

L'AND logico (&& nella maggior parte dei linguaggi) lavora su valori booleani interi e restituisce true/false, mentre l'AND bit a bit (&) elabora ogni bit di due numeri separatamente e restituisce un numero. Confondere i due è una causa comune di bug, soprattutto perché in alcuni linguaggi entrambi compilano senza alcun errore di tipo.

Perché questo strumento va di pari passo con il convertitore di basi

Un permesso con valore decimale 6 non dice nulla a colpo d'occhio, ma lo stesso valore scritto come 0b110 mostra subito "lettura e scrittura, senza esecuzione". Ecco perché le operazioni bit a bit si ragionano quasi sempre in binario o esadecimale, mai in decimale — il convertitore di basi è di solito il passaggio precedente prima che AND/OR/XOR abbiano senso visivo.

A cosa serve

  • Memorizzare e verificare in modo efficiente un insieme di flag booleani in un unico numero.
  • Comprendere codice di basso livello che lavora con protocolli di rete o formati binari.
  • Ottimizzare calcoli dove le operazioni bit a bit sono più veloci dell'aritmetica normale.

La trappola della precedenza degli operatori

Nella maggior parte dei linguaggi di programmazione, gli operatori bit a bit & e | hanno una precedenza inferiore rispetto agli operatori di confronto — quindi un'espressione come if (a & b == c) viene in realtà valutata come a & (b == c), non come normalmente intende chi la scrive. Questa è una delle cause più comuni di bug difficili da individuare quando si lavora con le maschere di bit, e il modo affidabile per evitarla è racchiudere sempre le operazioni bit a bit tra parentesi esplicite.

Prova lo strumento