Módulo 2 · Matemática para Programação — Capítulo 04

Sistemas de Numeração — Binário, Octal e Hexadecimal

Por que computadores contam em binário, como converter entre decimal, binário e hexadecimal na mão, e o fechamento deste módulo: a base matemática que sustenta tudo que vem depois.

1. Por que binário: dois estados, dois algarismos

O sistema decimal (base 10) que você usa desde criança tem 10 algarismos (0 a 9) porque humanos têm 10 dedos — é uma escolha de conveniência histórica, não matemática. Um computador não tem dedos; ele tem transistores, e cada transistor, no nível mais básico, só confiavelmente distingue dois estados elétricos: corrente passando ou corrente não passando. Ligado/desligado. Alta tensão/baixa tensão.

Representar mais de dois estados de forma confiável (por exemplo, dez níveis de tensão diferentes) é tecnicamente possível, mas seria muito mais sensível a ruído elétrico e caro de fabricar em escala de bilhões de unidades. Dois estados é o ponto ótimo de simplicidade e confiabilidade — e é exatamente aí que a álgebra booleana do capítulo anterior se encaixa perfeitamente: dois valores lógicos (V/F), dois estados elétricos (ligado/desligado), dois algarismos (0/1). Tudo a mesma ideia, três nomes diferentes.

Por isso o sistema binário (base 2) é a linguagem nativa de qualquer computador digital. Cada algarismo binário é chamado de bit (binary digit).

2. Convertendo decimal → binário

O método mais direto é dividir repetidamente por 2, anotando o resto de cada divisão, até chegar a zero. Depois, lê-se os restos de baixo para cima.

MATEMÁTICA decimal-para-binario.txt
Converter 41 para binário:

41 ÷ 2 = 20  resto 1
20 ÷ 2 = 10  resto 0
10 ÷ 2 =  5  resto 0
 5 ÷ 2 =  2  resto 1
 2 ÷ 2 =  1  resto 0
 1 ÷ 2 =  0  resto 1

Lendo os restos de baixo para cima: 101001

41 (decimal) = 101001 (binário)

Outro jeito de pensar, útil para conferir o resultado: cada posição do número binário vale uma potência de 2, da direita para a esquerda (2⁰, 2¹, 2², 2³...). Somando as posições que têm o algarismo 1:

MATEMÁTICA conferindo.txt
101001
543210  ← posições (potências de 2)

1×2⁵ + 0×2⁴ + 1×2³ + 0×2² + 0×2¹ + 1×2⁰
= 32 + 0 + 8 + 0 + 0 + 1
= 41 ✓

3. Convertendo binário → decimal

É o processo inverso: multiplique cada bit pela potência de 2 da sua posição e some tudo — exatamente o cálculo de "conferência" que você acabou de ver acima. Não existe atalho especial, o mesmo procedimento serve nos dois sentidos.

Comparando com o que você já sabe

Em qualquer linguagem, parseInt("101001", 2) (JS) ou Convert.ToInt32("101001", 2) (C#) fazem exatamente essa conta para você. Mas entender o algoritmo manual ajuda a entender por que overflow de inteiro, máscaras de bits e operadores como << (deslocamento) funcionam do jeito que funcionam.

4. Hexadecimal: um "atalho" compacto para binário

O sistema hexadecimal (base 16) usa 16 algarismos: 0-9 e depois A, B, C, D, E, F para representar 10 a 15. À primeira vista parece só "mais uma base", mas ele tem uma propriedade especial que o torna extremamente usado em computação: 16 = 2⁴, então cada dígito hexadecimal representa exatamente 4 bits (um "nibble"), sem sobra e sem resto.

Isso torna a conversão binário ↔ hexadecimal muito mais rápida que decimal ↔ binário: basta agrupar o binário em blocos de 4 bits, da direita para a esquerda, e converter cada bloco separadamente.

MATEMÁTICA binario-para-hex.txt
Converter 11010110 para hexadecimal:

Agrupar em blocos de 4 bits:  1101 | 0110
Converter cada bloco:         13   |  6
Em hexadecimal:                D   |  6

11010110 (binário) = D6 (hexadecimal)
Binário (4 bits)DecimalHexadecimal
101010A
101111B
110012C
110113D
111014E
111115F
Nota

Você já usa hexadecimal sem perceber toda vez que escreve uma cor CSS como #FF5733. São três pares de dígitos hex — um para vermelho (FF = 255), um para verde (57 = 87) e um para azul (33 = 51) — cada par representando exatamente um byte (8 bits = dois blocos de 4 bits). Endereços de memória e hashes (como commits do Git) também costumam ser exibidos em hexadecimal pelo mesmo motivo: é compacto e mapeia direto para binário.

5. Octal: mais raro hoje, mas com a mesma lógica

O sistema octal (base 8) segue a mesma ideia do hexadecimal — como 8 = 2³, cada dígito octal representa exatamente 3 bits. Ele já foi mais popular (permissões de arquivo em sistemas Unix/Linux, como chmod 755, ainda usam octal até hoje), mas perdeu espaço para o hexadecimal porque 4 bits se alinham melhor com o tamanho de byte (8 bits) usado universalmente pela memória dos computadores modernos.

6. Tabela comparativa: decimal, binário, octal e hexadecimal

Vale memorizar de cabeça pelo menos os primeiros valores — eles aparecem o tempo todo em depuração de bits, máscaras e leitura de dumps de memória.

DecimalBinárioOctalHexadecimal
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010
Atenção

Repare que 16 em hexadecimal é escrito 10 — mesma "forma" visual do decimal 10, mas valor completamente diferente. A base em que um número está escrito nunca é opcional de saber; por isso é comum ver prefixos como 0x (hexadecimal) ou 0b (binário) em código para deixar isso explícito — 0x10 em C#/JS vale 16 em decimal, não 10.

7. Onde isso te leva

Feche este módulo e olhe para trás: você agora tem lógica proposicional (o que é uma condição e como combiná-las), álgebra booleana e portas lógicas (como essas condições viram circuitos físicos), conjuntos e funções (a base formal de coleções e de toda função que você já escreveu), e sistemas de numeração (como qualquer dado, de um número a uma cor, vira sequência de bits). Essa é literalmente a matemática por trás de todo if, todo tipo booleano e toda representação de dado, em qualquer linguagem de programação — não é conhecimento específico de uma tecnologia, é o chão comum debaixo de todas elas.

O próximo módulo, Algoritmos e Estruturas de Dados, parte exatamente daqui: agora que você sabe raciocinar formalmente sobre condições, conjuntos e representação binária de dados, o próximo passo é aprender a organizar e processar esses dados de forma eficiente — pilhas, filas, listas, busca, ordenação, complexidade de algoritmos. Só depois disso o curso entra, finalmente, em C# propriamente dito — e você vai chegar lá com uma base que a maioria de quem aprende programação "direto no código" nunca para para construir.

📌 Resumo do capítulo

  • Computadores usam binário porque transistores confiavelmente só distinguem dois estados elétricos: ligado/desligado.
  • Decimal → binário: divisões sucessivas por 2, lendo os restos de baixo para cima.
  • Binário → decimal: somar cada bit multiplicado pela potência de 2 da sua posição.
  • Hexadecimal (base 16) mapeia exatamente 4 bits por dígito (16 = 2⁴) — por isso é tão usado em cores CSS, hashes e endereços de memória.
  • Octal (base 8) mapeia 3 bits por dígito (8 = 2³) — ainda vivo em permissões Unix/Linux (chmod).
  • O mesmo número escrito em bases diferentes tem representações diferentes — por isso prefixos como 0x e 0b existem.
  • Este módulo fecha a base: lógica proposicional + álgebra booleana + sistemas de numeração sustentam todo if, tipo booleano e dado de qualquer linguagem.

✏️ Praticando

  1. Converta 77 (decimal) para binário, mostrando cada divisão.
  2. Converta 11001010 (binário) para decimal e depois para hexadecimal.
  3. A cor CSS #1AB3E6 — quanto vale cada componente (R, G, B) em decimal?
  4. Converta 250 (decimal) para hexadecimal e para octal.
  5. Sem calcular tudo de novo: se 11010110 (binário) = D6 (hex), quanto vale 11010111 em hex? (dica: só mudou o último bit).