
Sistemi di numerazione e operazioni sui bit — Guida completa
Impara conversioni, maschere, complemento a due, intervalli degli interi e operazioni sui registri con esempi di sistemi embedded.
Riproduci gli esempi con il convertitore di basi numeriche. Binario, decimale, esadecimale e ottale rappresentano lo stesso intero con cifre diverse. Il binario descrive stati logici e registri, l’esadecimale compatta byte e indirizzi, il decimale facilita le misure e l’ottale raggruppa i bit a tre a tre, ad esempio nelle maschere dei permessi.
1. Basi e notazione posizionale
La base 2 usa 0–1; la base 8, 0–7; la base 10, 0–9; la base 16 anche A–F, con A = 10 e F = 15. Per cifre dᵢ in base b: N = Σ dᵢ × bⁱ, partendo da i = 0 a destra. Gli zeri iniziali non cambiano il valore ma possono indicare la larghezza del registro.
| DEC | BIN | HEX | OCT |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 8 | 10 |
| 9 | 1001 | 9 | 11 |
| 10 | 1010 | A | 12 |
| 11 | 1011 | B | 13 |
| 12 | 1100 | C | 14 |
| 13 | 1101 | D | 15 |
| 14 | 1110 | E | 16 |
| 15 | 1111 | F | 17 |
2. Conversioni passo per passo
Da binario a decimale: 10101010₂ = 1×128 + 0×64 + 1×32 + 0×16 + 1×8 + 0×4 + 1×2 + 0×1 = 170₁₀. Si sommano i pesi delle posizioni a uno.
Da decimale a binario: dividi ripetutamente per 2 e annota i resti. Per 13: 13 = 2×6+1; 6 = 2×3+0; 3 = 2×1+1; 1 = 2×0+1. Leggendoli dal basso si ottiene 1101. Analogamente, 255₁₀ = 11111111₂ = FF₁₆ = 377₈.
Da binario a esadecimale: raggruppa da destra in gruppi di quattro e completa solo quello a sinistra: 1010 1011 1100 1101₂ = ABCD₁₆. Ogni gruppo corrisponde a una cifra perché 16 = 2⁴.
Da esadecimale a binario: sostituisci ogni cifra con quattro bit: 0x2F → 0010 1111₂ → 47₁₀. Maiuscole e minuscole hanno lo stesso valore.
Ottale: raggruppa in terne perché 8 = 2³: 11111111₂ → 011 111 111₂ = 377₈. Al contrario, 17₈ → 001 111₂ = 15₁₀. Per posizioni: 377₈ = 3×8² + 7×8 + 7 = 255. Da decimale a ottale usa divisioni successive per 8.
3. Aritmetica e interi esatti
Esempi: 0x0F + 0b1 = 16, 20 − 7 = 13, 0o7 × 0x3 = 21. L’addizione binaria riporta quando una colonna raggiunge due: 0111 + 0001 = 1000.
Lo strumento conserva gli interi come BigInt, anche oltre 2⁵³ − 1. La divisione intera tronca verso zero: −7 ÷ 3 = −2. % restituisce un resto con il segno del dividendo, non un modulo euclideo sempre non negativo: −7 % 3 = −1. Per b diverso da zero, a = (a / b) × b + (a % b). Divisione e resto per zero generano un errore.
4. AND, OR, XOR e NOT
AND conserva i bit attivi in entrambi gli ingressi; OR attiva quelli presenti in almeno uno; XOR attiva le posizioni diverse; NOT inverte tutti i bit nella larghezza scelta. Ogni colonna viene elaborata indipendentemente.
| A | B | A AND B | A OR B | A XOR B | NOT A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
Su otto bit: 11111111 & 00001111 = 00001111 (15); 10100000 | 00001111 = 10101111 (175); 10101010 ^ 11111111 = 01010101 (85). NOT di 00001111 senza segno dà 11110000 (240). Auto non ha una maschera finita: ~15 = −16, poiché ~x = −x − 1.
5. Interi con segno e complemento a due
Senza segno, il valore è Σ bᵢ2ⁱ e l’intervallo 0 … 2ʷ−1. Nel complemento a due, il bit più significativo pesa −2ʷ⁻¹ e l’intervallo è −2ʷ⁻¹ … 2ʷ⁻¹−1. Se quel bit è attivo, sottrai 2ʷ all’interpretazione senza segno.
Su otto bit: FF = 255 − 256 = −1, 80 = 128 − 256 = −128. Per codificare −5, inverti 00000101 in 11111010 e aggiungi uno: 11111011 = FB. Su sedici bit, FFFF è −1. Il complemento a due è una rappresentazione binaria dipendente dalla larghezza, non un’altra base.
| Bit | Senza segno | Con segno |
|---|---|---|
| 8 | 0 … 255 | −128 … 127 |
| 16 | 0 … 65535 | −32768 … 32767 |
| 32 | 0 … 4294967295 | −2147483648 … 2147483647 |
| 64 | 0 … 18446744073709551615 | −9223372036854775808 … 9223372036854775807 |
DEC è un valore matematico. A larghezza fissa, BIN/HEX/OCT non negativi sono sequenze di bit: HEX FF con segno a 8 bit dà DEC −1, mentre DEC 255 viene rifiutato. Gli ingressi negativi devono rientrare nell’intervallo matematico. Nessun ingresso viene troncato silenziosamente. Le uscite non decimali vengono riempite con zeri; la prima cifra ottale può contenere fino a due bit superiori inutilizzati.
Auto non impone larghezza né intervallo senza segno. I negativi vengono mostrati con segno e modulo. La vista mostra al massimo i 128 bit meno significativi del modulo; conversioni e copie mantengono l’intero completo.
6. Scorrimenti e overflow
Uno scorrimento a sinistra di k bit moltiplica per 2ᵏ senza limite di larghezza: 0x01 << 4 = 0x10 = 16. Con larghezza fissa viene applicata la maschera 2ʷ−1. Su otto bit senza segno, 0x80 << 1 ha risultato esatto 256 e memorizzato 0, con avviso. Con segno, 0x40 << 1 diventa −128 con avviso perché 128 non rientra nell’intervallo.
Lo scorrimento logico a destra inserisce zeri: FF >> 1 = 7F = 127 senza segno. Quello aritmetico propaga il segno: FF >> 1 = FF = −1, 80 >> 1 = C0 = −64, con segno a otto bit. Per i negativi arrotonda verso meno infinito: −3 >> 1 = −2, mentre −3 / 2 = −1.
B è sempre un numero decimale non negativo da 0 a 65536, indipendentemente dalla base precedente e dalla larghezza. Il limite controlla il lavoro per calcolo, non la precisione degli ingressi. Il numero di scorrimenti non viene ridotto modulo 32 o modulo la larghezza. Spostare a destra di 8 posizioni un valore senza segno di otto bit dà 0. L’overflow aritmetico, come 255 + 1 senza segno o −128 / −1 con segno su otto bit, viene rifiutato mostrando il risultato DEC esatto. Auto segue la semantica BigInt con segno e larghezza illimitata.
7. Registri STM32, maschere e flag
Su STM32F407 il registro GPIO di ingresso contiene gli stati dei pin. Dopo aver configurato clock e periferica, un header CMSIS permette questo accesso illustrativo:
uint32_t snapshot = GPIOA->IDR;
uint32_t pin5 = (snapshot >> 5u) & 1u;
uint32_t field = (snapshot >> 4u) & 0x0Fu;
GPIOA->BSRR = 1u << 5u;
Se snapshot vale 0xB0, pin5 è 1 e i bit 7:4 formano 0xB = 11. La scrittura BSRR imposta il bit di uscita 5 senza lettura-modifica-scrittura software di ODR; la modalità del pin determina ancora il comportamento esterno. Consulta il manuale specifico per clock, bit riservati e campi cancellati scrivendo uno. Una singola acquisizione evita letture successive di stati diversi.
Queste operazioni riguardano una variabile locale senza segno:
uint32_t flags = 0u;
uint32_t mask = 1u << 3u;
flags |= mask;
flags &= ~mask;
flags ^= mask;
uint32_t active = (flags & mask) != 0u;
La maschera 0x08 seleziona il bit 3. OR lo imposta, AND con il complemento lo cancella, XOR lo inverte e l’espressione finale lo verifica. Lettura-modifica-scrittura non è automaticamente atomica per memoria condivisa o registri: usa i meccanismi documentati o una sincronizzazione appropriata.
8. CAN, UART, SPI, ADC e FPGA
I byte 0x12 e 0x34, in un campo big endian definito dal protocollo, valgono (0x12 << 8) | 0x34 = 0x1234 = 4660; little endian dà 0x3412 = 13330. I campi CAN seguono la specifica del messaggio o il DBC. La struttura UART e l’ordine dei bit SPI non definiscono da soli l’ordine dei byte di un valore multibyte. Consulta UART e SPI.
Per un ADC senza segno a 12 bit, 0xABC = 2748 appartiene a 0–4095. Una semplice approssimazione di visualizzazione tra estremi con Vref = 3,3 V dà 2748 × 3,3 / 4095 ≈ 2,2145 V. Non è la legge esatta di quantizzazione: il passo ideale è 3,3/4096 V e la caratteristica reale dipende dall’ADC. I dati con segno possono usare complemento a due o binario con offset. Verifica codifica e allineamento, poi usa il calcolatore ADC/DAC.
In FPGA e microcontrollori dichiara larghezza e segno esplicitamente. In SystemVerilog 8'hFF è una sequenza senza segno di otto bit; 8'shFF rappresenta −1 con segno. I letterali senza dimensione e le promozioni possono cambiare il risultato. Le maschere della calcolatrice non riproducono tutte le regole C/C++ o HDL.
9. Domande frequenti
Come converto da binario a esadecimale?
Raggruppa da destra in gruppi di quattro e sostituisci ogni gruppo con 0–F. Ad esempio, 1111 0000 diventa F0. Completa a sinistra con zeri se necessario.
Qual è la differenza tra interi con e senza segno?
Senza segno, tutti i bit contribuiscono a un valore non negativo. Nel complemento a due, il bit più significativo ha peso negativo. FF su otto bit è 255 senza segno o −1 con segno.
Come funziona il complemento a due?
Per un negativo su w bit, aggiungi il suo valore a 2ʷ. Equivale a invertire i bit del modulo positivo e aggiungere uno nella larghezza scelta.
Che cos’è un’operazione XOR bit a bit?
Produce uno dove i bit di ingresso differiscono. Una maschera XOR inverte le posizioni selezionate: AA XOR FF dà 55.
Come estraggo bit da un registro?
Sposta il campo a destra e applica AND con una maschera della sua larghezza. Per i bit 7:4: (reg >> 4) & 0x0F. Rispetta gli effetti delle letture hardware.
Perché FF a volte significa −1?
L’interpretazione dipende dalla larghezza: FF attiva il bit di segno su otto bit, ma 00FF su sedici bit rappresenta +255.