ElectroDesignForgeElectroDesignForge
ElectroDesignForge

Trova una pagina

Strumenti PCB
Componenti
Progettazione
Piedinature e connettori

Cavi

Documentazione
Calcolatori

Convertitori

Frecce per navigare · Invio per aprire · Esc per chiudere

FondamentiSegnali e interfacce

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.

DECBINHEXOCT
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000810
91001911
101010A12
111011B13
121100C14
131101D15
141110E16
151111F17

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.

ABA AND BA OR BA XOR BNOT A
000001
010111
100110
111100

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.

BitSenza segnoCon segno
80 … 255−128 … 127
160 … 65535−32768 … 32767
320 … 4294967295−2147483648 … 2147483647
640 … 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.

10. Riferimenti tecnici