Simulatore di operazioni sui bit (AND, OR, XOR, NOT e scorrimenti)

Calcola su due numeri le operazioni AND, OR, XOR, NOT e gli scorrimenti a sinistra e a destra, mostrando in una griglia binaria come cambia ciascun bit. Sono previste ampiezze di 8, 16 e 32 bit.

Consigli per l'uso

  • I valori si possono inserire non solo in decimale, ma anche in esadecimale con il prefisso `0x1A` o in binario con `0b1010`: potete provare direttamente le notazioni che usate scrivendo programmi.
  • AND, OR e XOR operano su due valori, NOT su uno solo. Cambiando operazione, il numero dei campi di immissione si adegua da sé.
  • Lo scorrimento a destra `>>>` è previsto soltanto nella forma logica. La differenza rispetto allo scorrimento aritmetico, che tiene conto del bit di segno, è illustrata nelle domande frequenti.
  • Passando l'ampiezza da 8 a 16 e poi a 32 bit potete osservare come, a parità di valore, aumentino gli zeri nei bit più significativi: è un buon aiuto per afferrare il concetto di ampiezza.
  • I bit evidenziati in giallo sono quelli cambiati fra prima e dopo l'operazione: con AND e OR si segue così a colpo d'occhio quale dei due valori in ingresso si sia riflesso nel risultato.

Domande frequenti

Sì. Lo scorrimento logico, `>>>`, riempie sempre con zeri i bit più significativi lasciati liberi, mentre quello aritmetico, `>>`, vi replica il bit di segno, cioè il più significativo. Poiché questo strumento tratta i valori come interi non negativi entro l'ampiezza scelta, con finalità didattiche, non fa del segno il proprio oggetto e propone soltanto lo scorrimento logico, più semplice da comprendere.

Gli operatori sui bit di JavaScript calcolano internamente su interi con segno a 32 bit: applicando NOT a `00000001`, cioè 1 su 8 bit, si ottiene di norma il valore negativo -2. Questo strumento applica invece una maschera secondo l'ampiezza scelta, 8, 16 o 32 bit, e mostra quindi la rappresentazione corretta entro quell'ampiezza, per esempio `11111110`, cioè 254, su 8 bit.

AND dà 1 soltanto quando entrambi i bit valgono 1 e si usa molto per le mascherature che estraggono determinati bit. OR dà 1 quando almeno uno dei due vale 1 e serve ad accendere bit specifici. XOR dà 1 soltanto quando i bit differiscono e si impiega per invertire valori o scambiarli fra loro.

Lo scorrimento a sinistra, `<<`, è un modo rapido per moltiplicare per una potenza di due, per esempio per due o per quattro; quello a destra, qui nella forma logica, si usa per dividere per due o per estrarre un determinato intervallo da una sequenza di bit. Ricorrono spesso anche nella programmazione competitiva e negli algoritmi basati sulle maschere di bit.

A rigore sono due cose distinte. L'operazione sui bit indica il calcolo in sé — AND, OR, XOR, NOT, scorrimenti — mentre la maschera di bit è il valore con cui, servendosi di quelle operazioni, soprattutto AND e OR, si estraggono o si riscrivono determinati bit. Per esempio `value & 0b00001111` è la tipica maschera che estrae i quattro bit meno significativi.
Tool-kun

A proposito — le curiose proprietà dello XOR e i suoi impieghi pratici

Le operazioni sui bit corrispondono direttamente ai circuiti logici dell'elaboratore e sono le più elementari in assoluto: tanto rapide che il processore le esegue in un solo ciclo di clock. Poiché si realizzano con meccanismi assai più semplici delle quattro operazioni aritmetiche, là dove conta la prestazione — elaborazione delle immagini, crittografia, realizzazione dei protocolli di rete — da tempo si ricorre alla tecnica di sostituire moltiplicazioni e divisioni con operazioni sui bit equivalenti.

Lo XOR, la disgiunzione esclusiva, ha proprietà curiose: lo XOR di un valore con sé stesso dà sempre zero, cioè `a ^ a = 0`, e lo XOR con zero restituisce il valore originario, cioè `a ^ 0 = a`. Sfruttando queste due proprietà si ottiene lo scambio con XOR, tecnica classica che permette di invertire il contenuto di due variabili senza ricorrere a una variabile d'appoggio, con la sequenza `a ^= b; b ^= a; a ^= b;`. Oggi, per ragioni di leggibilità, se ne sconsiglia l'uso nel lavoro reale, ma resta un esempio spesso citato per imparare le proprietà delle operazioni sui bit.

Le maschere di bit hanno larghissimo impiego pratico. I permessi sui file di Unix — la combinazione di lettura, che vale quattro, scrittura, che vale due, ed esecuzione, che vale uno — non sono altro che OR e AND fra bit; e anche l'estrazione delle componenti rossa, verde e azzurra da un codice di colore come #FF0000 si ottiene combinando scorrimenti a destra e maschere AND. La tecnica dei contrassegni di bit, che raccoglie in un solo numero intero molti indicatori di acceso e spento, era del resto diffusissima nella programmazione dei vecchi videogiochi e sistemi, dove occorreva gestire molti stati con poca memoria.