
Sistemas de numeração e operações de bits — Guia completo
Aprenda conversões, máscaras, complemento de dois, faixas de inteiros e operações com registradores usando exemplos de sistemas embarcados.
Reproduza os exemplos com o conversor de bases numéricas. Binário, decimal, hexadecimal e octal representam o mesmo inteiro com conjuntos diferentes de dígitos. O binário descreve estados lógicos e registradores; o hexadecimal resume bytes e endereços; o decimal facilita medidas; o octal agrupa bits de três em três, como em máscaras de permissões.
1. Bases e notação posicional
A base 2 usa 0–1; a base 8, 0–7; a base 10, 0–9; e a base 16, 0–9 e A–F, com A = 10 e F = 15. Para dígitos dᵢ em base b: N = Σ dᵢ × bⁱ, começando por i = 0 à direita. Zeros à esquerda não alteram o valor, mas podem indicar a largura do registrador.
| 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. Conversão passo a passo
Binário para decimal: 10101010₂ = 1×128 + 0×64 + 1×32 + 0×16 + 1×8 + 0×4 + 1×2 + 0×1 = 170₁₀. Some os pesos das posições com valor um.
Decimal para binário: divida sucessivamente por 2 e anote os restos. Para 13: 13 = 2×6+1; 6 = 2×3+0; 3 = 2×1+1; 1 = 2×0+1. Lendo de baixo para cima, os restos formam 1101. Também vale 255₁₀ = 11111111₂ = FF₁₆ = 377₈.
Binário para hexadecimal: agrupe de quatro em quatro a partir da direita e complete apenas o grupo esquerdo: 1010 1011 1100 1101₂ = ABCD₁₆. Cada grupo equivale a um dígito porque 16 = 2⁴.
Hexadecimal para binário: substitua cada dígito por quatro bits: 0x2F → 0010 1111₂ → 47₁₀. Maiúsculas e minúsculas têm o mesmo valor.
Octal: agrupe em trios porque 8 = 2³: 11111111₂ → 011 111 111₂ = 377₈. No sentido inverso, 17₈ → 001 111₂ = 15₁₀. Pela notação posicional: 377₈ = 3×8² + 7×8 + 7 = 255. De decimal para octal, use divisões sucessivas por 8.
3. Aritmética e inteiros exatos
Exemplos: 0x0F + 0b1 = 16, 20 − 7 = 13, 0o7 × 0x3 = 21. Na adição binária, ocorre transporte quando uma coluna soma dois: 0111 + 0001 = 1000.
A ferramenta mantém os inteiros como BigInt, inclusive acima de 2⁵³ − 1. A divisão inteira trunca em direção a zero: −7 ÷ 3 = −2. % fornece resto com o sinal do dividendo, não módulo euclidiano sempre não negativo: −7 % 3 = −1. Para b diferente de zero, a = (a / b) × b + (a % b). Divisão e resto por zero geram erro.
4. AND, OR, XOR e NOT
AND mantém os bits ativos nas duas entradas; OR ativa os presentes em qualquer uma; XOR ativa os que diferem; NOT inverte todos os bits dentro da largura escolhida. Cada coluna é processada de forma independente.
| 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 |
Em oito bits: 11111111 & 00001111 = 00001111 (15); 10100000 | 00001111 = 10101111 (175); 10101010 ^ 11111111 = 01010101 (85). NOT de 00001111 sem sinal resulta em 11110000 (240). Auto não tem máscara finita: ~15 = −16, pois ~x = −x − 1.
5. Inteiros com sinal e complemento de dois
Sem sinal, o valor é Σ bᵢ2ⁱ, na faixa 0 … 2ʷ−1. No complemento de dois, o bit mais significativo tem peso −2ʷ⁻¹, com faixa −2ʷ⁻¹ … 2ʷ⁻¹−1. Se esse bit estiver ativo, subtraia 2ʷ da interpretação sem sinal.
Em oito bits: FF = 255 − 256 = −1; 80 = 128 − 256 = −128. Para codificar −5, inverta 00000101 para 11111010 e some um: 11111011 = FB. Em dezesseis bits, FFFF representa −1. O complemento de dois é uma representação binária dependente da largura, não outra base.
| Bits | Sem sinal | Com sinal |
|---|---|---|
| 8 | 0 … 255 | −128 … 127 |
| 16 | 0 … 65535 | −32768 … 32767 |
| 32 | 0 … 4294967295 | −2147483648 … 2147483647 |
| 64 | 0 … 18446744073709551615 | −9223372036854775808 … 9223372036854775807 |
DEC é um valor matemático. Em largura fixa, BIN/HEX/OCT não negativos são padrões: HEX FF com sinal de 8 bits resulta em DEC −1, enquanto DEC 255 é rejeitado. Entradas negativas precisam caber na faixa matemática. Nenhuma entrada é truncada silenciosamente. As saídas não decimais são preenchidas com zeros; o primeiro dígito octal pode conter até dois bits superiores não utilizados.
Auto não impõe largura nem faixa sem sinal. Os negativos são exibidos com sinal e magnitude. A visualização mostra no máximo os 128 bits menos significativos da magnitude; conversões e cópias mantêm o inteiro completo.
6. Deslocamentos e estouro
Deslocar k bits à esquerda multiplica por 2ᵏ sem limite de largura: 0x01 << 4 = 0x10 = 16. Em largura fixa aplica-se a máscara 2ʷ−1. Em oito bits sem sinal, 0x80 << 1 tem resultado exato 256 e armazenado 0, com aviso. Com sinal, 0x40 << 1 vira −128 com aviso porque 128 excede a faixa.
O deslocamento lógico à direita insere zeros: FF >> 1 = 7F = 127 sem sinal. O aritmético propaga o sinal: FF >> 1 = FF = −1, 80 >> 1 = C0 = −64, com sinal de oito bits. Para negativos, arredonda para menos infinito: −3 >> 1 = −2, enquanto −3 / 2 = −1.
B sempre é uma quantidade decimal não negativa de 0 a 65536. Esse limite controla o trabalho por cálculo sem restringir a precisão das entradas. A quantidade não é reduzida módulo 32 ou módulo a largura. Deslocar um inteiro sem sinal de oito bits à direita em 8 posições resulta em 0. O estouro aritmético, como 255 + 1 sem sinal ou −128 / −1 com sinal de oito bits, é rejeitado com o resultado DEC exato. Auto segue a semântica BigInt com sinal e largura ilimitada.
7. Registradores STM32, máscaras e flags
No STM32F407, o registrador GPIO de entrada contém os estados dos pinos. Após configurar o clock e o periférico, um cabeçalho CMSIS permite este acesso ilustrativo:
uint32_t snapshot = GPIOA->IDR;
uint32_t pin5 = (snapshot >> 5u) & 1u;
uint32_t field = (snapshot >> 4u) & 0x0Fu;
GPIOA->BSRR = 1u << 5u;
Se snapshot for 0xB0, pin5 é 1 e os bits 7:4 formam 0xB = 11. A escrita em BSRR ativa o bit de saída 5 sem leitura-modificação-escrita de ODR por software; o modo do pino ainda determina seu comportamento externo. Consulte o manual exato sobre clocks, bits reservados e campos apagados ao escrever um. Uma captura evita leituras sucessivas potencialmente diferentes.
Estas operações se aplicam a uma variável local sem sinal:
uint32_t flags = 0u;
uint32_t mask = 1u << 3u;
flags |= mask;
flags &= ~mask;
flags ^= mask;
uint32_t active = (flags & mask) != 0u;
A máscara 0x08 seleciona o bit 3. OR o ativa, AND com o complemento o limpa, XOR o alterna e a expressão final o testa. Leitura-modificação-escrita não é automaticamente atômica para memória compartilhada ou registradores; utilize mecanismos documentados ou sincronização apropriada.
8. CAN, UART, SPI, ADC e FPGA
Com os bytes 0x12 e 0x34, um campo big endian definido pelo protocolo vale (0x12 << 8) | 0x34 = 0x1234 = 4660; little endian fornece 0x3412 = 13330. Campos CAN seguem a especificação da mensagem ou o DBC. O enquadramento UART e a ordem de bits SPI não definem sozinhos a ordem de bytes de um valor multibyte. Consulte UART e SPI.
Em um ADC sem sinal de 12 bits, 0xABC = 2748 está em 0–4095. Uma aproximação de exibição entre extremos com Vref = 3,3 V fornece 2748 × 3,3 / 4095 ≈ 2,2145 V. Não é a lei exata de quantização: o passo ideal é 3,3/4096 V e a transferência real depende do ADC. Dados com sinal podem usar complemento de dois ou binário deslocado. Verifique alinhamento e codificação e use a calculadora ADC/DAC.
Declare largura e sinal explicitamente em FPGA e microcontroladores. Em SystemVerilog, 8'hFF é um padrão sem sinal de oito bits; 8'shFF representa −1 com sinal. Literais sem tamanho e promoções podem mudar resultados. As máscaras desta calculadora não reproduzem todas as regras de C/C++ ou HDL.
9. Perguntas frequentes
Como converter binário para hexadecimal?
Agrupe os bits da direita para a esquerda de quatro em quatro e substitua cada grupo por 0–F. Por exemplo, 1111 0000 é F0. Complete o grupo esquerdo com zeros se necessário.
Qual é a diferença entre inteiros com e sem sinal?
Sem sinal, todos os bits contribuem para um valor não negativo. No complemento de dois, o bit mais significativo tem peso negativo. FF em oito bits vale 255 sem sinal ou −1 com sinal.
Como funciona o complemento de dois?
Para um negativo em w bits, some o valor a 2ʷ. Isso equivale a inverter os bits da magnitude positiva e somar um dentro da largura.
O que é uma operação XOR bit a bit?
Produz um quando os bits de entrada diferem. Uma máscara XOR alterna as posições selecionadas: AA XOR FF resulta em 55.
Como extrair bits de um registrador?
Desloque o campo para a direita e aplique AND com uma máscara da mesma largura. Para os bits 7:4: (reg >> 4) & 0x0F. Respeite os efeitos das leituras do hardware.
Por que FF às vezes significa −1?
A interpretação depende da largura: FF ativa o bit de sinal em oito bits, mas 00FF em dezesseis bits representa +255.