Escovando bits: criando nossa primeira máquinas de somar
Introdução
Como vimos no post anterior podemos, com algumas operações simples, fazermos vários testes lógicos com zeros e uns. Operações booleanas. Se você não viu o teste anterior, pode seguir por aqui.
Agora, com aqueles conceitos já bem definidos, vamos pensar um pouco sobre como podemos efetivamente fazer contas com aquilo. Pequenas máquinas de somar.
Computadores são máquinas de somar
No post anterior, falamos que todas as operações que um computador faz, das mais simples até as mais complicadas, são somas disfarçadas.
Falamos também que o computador só entende o que é 0 e 1. Mas como ele pode somar dois números, por exemplo, 2 + 3, e nos dar o resultado 5, sendo que ele nem sabe o que é um “2”, nem um “3”? Muito menos um “5”.
Bom, dentro dos computadores, temos uma peça central chamada CPU (Unidade de Processamento Central, em português) que é responsável por interpretar os comandos dos programas e executar o que quer que eles façam. Se dermos um zoom muito agressivo nessa peça, chegaremos em dois componentes que fazem toda a mágica acontecer: o half-adder e o full-adder.
Como o computador junta dois números?
Na eletrônica, ciência base da programação, os componentes centrais que fazem tudo acontecer são chamados de transistores. Eles são pequenos interruptores elétricos que, quando são submetidos a uma determinada voltagem, deixam uma corrente passar. Um transistor tem dois estados: ligado, onde ele deixa a corrente passar; e desligado, onde ele não deixa. Daí que vem o 0 e 1 da programação. Nada mais é do que uma representação abstrata do “ligado” e “desligado” do transistor.
Podemos representar qualquer número com esse sistema de ligado e desligado. Por exemplo: o número 3, nesse sistema, pode ser representado por 0011. A mesma coisa com o número 2, que ficaria 0010. O 5, por sua vez, é 0101.
Assim como na matemática tradicional, quando um número é maior que 9, na unidade, adicionamos um na dezena e recomeçamos a conta (exemplo: …7, 8, 9, 10, 11…), nos números binários acontece a mesma coisa. Só que como estamos trabalhando com apenas dois dígitos, assim que o valor chega em 1, eu passo para a próxima casa. Exemplo:
| Milhar | Centena | Dezena | Unidade |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 |
| 0 | 0 | 1 | 0 |
| 0 | 0 | 1 | 1 |
Assim, sucessivamente.
Para somar dois números na matemática decimal, é simples: Eu complemento o valor de um com o valor de outro e tenho o resultado final. Dois mais dois é quatro porque se eu pego duas unidades de alguma coisa e junto com duas outras unidades dessa mesma coisa, dá quatro unidades. Vamos tentar abstrair, imaginar, esse conceito para a matemática dos binários.
Comecemos simples, 1+1 = 2. Nada muito complexo para não cansar:
1
0001
+ 0001
______
0010
Perceba o seguinte: quando queremos somar “1” com “1” em binário, não podemos colocar o resultado “2”, porque isso ultrapassaria o limite do sistema. Imagine que você quer somar 25+25. Você
- soma 5+5 primeiro, que dá 10;
- passa a dezena do dez para a próxima casa, o famoso “vai um”;
- soma 2+2, que dá 4. Mais 1, do “vai um” que subiu;
- no final, chegamos no resultado “50”, que é o valor certo.
Em binário, estamos fazendo a mesma coisa:
- soma
0001+0001primeiro, que dá0010(lembre-se, estamos somando primeiro as unidades); - passa o 1 da dezena para a próxima casa, o famoso “vai um”;
- soma 0+0, que dá 0. Mais 1, do “vai um” que subiu;
- no final, chegamos no resultado
0010, que é o valor certo.
Em inglês, o “vai um” é chamado de carry e é padrão de nomenclatura que vocês acharão por aí. Por isso, de agora em diante, o chamaremos assim.
Descobrindo um padrão interessante
Olha só, se pararmos para pensar, dá até para achar um padrão nessas somas de binários. Não é como se precisássemos achar todos os padrões entre 0 e 9. É só entre 0 e 1. Vamos tentar montar uma tabelinha para descobrir essas somas:
| A | B | Resultado |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 (já vamos falar desse caso) |
Se você for atento ao post anterior, você vai descobrir de onde é que essa tabelinha existe: A CONDIÇÃO XOR! Quando estamos somando dois números binários no computador, estamos apenas aplicando a condição do OU eXclusivo, o XOR. Se a gente conseguisse fazer um dispositivo, usando transistores, que simulasse esse comportamento do XOR, dava pra somar dois números binários! Para nossa sorte, existe, e já vamos montar ele já, já. Antes disso vamos dar uma olhada naquele caso ali.
Perceba que se eu somar 0001+0001, eu vou ter um “vai um”. Isso é o que chamamos de carry. Ele é um tópico interessante e apartado porque dá pra calcular ele utilizando outra tabelinha.
| A | B | Carry |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Novamente, podemos notar certa semelhança entre essa tabela e a do post anterior. Ela é, nada mais, nada menos, do que uma CONDIÇÃO “E”. Perceba, eu só vou ter carry quando os dois valores forem verdadeiros, 1.
Bom, com isso, acho que já dá para juntar os dois conceitos.
Transformando conceitos em realidade
Se existisse uma maneira de transformar esses operadores “XOR” e “E” em coisas físicas, reais, peças de eletrônica, daria para ver na prática essas tabelas funcionando.
Então, existe. Vamos usar aqui o site Logic.ly como demonstração.
Vamos começar: vou adicionar dois interruptores que vão fazer aqui o papel de transistor. Eles vão ser o nosso 1 e 0. E vou conectá-los a uma condicional lógica, a condicional “XOR”.

Cada uma das condicionais ou portas tem um símbolo específico. Esse é a do “XOR”. Ao longo do post, vamos descobrindo um por um. O que devemos nos atentar agora é se ela corresponde ao que vimos na tabela.



Como podemos ver, realmente, ela segue todos os conceitos da tabela que montamos, ou seja, estamos no caminho certo.
Entretanto, isso não seria o suficiente para montar nossa máquina de somar 1 com 1 em binário. Na última imagem acima, podemos perceber que, se eu adicionar um mais um, a lâmpada não acende. Como vamos tratar o carry?
Ora, muito simples. Se já sabemos que a tabela para calcular o carry é a tabela da condicional “E”, é só adicioná-la ao diagrama.




Pronto, adicionando a condicional “E”, já podemos calcular o valor do carry também. Isso é o que chamamos de half-adder. Ele já consegue calcular parte do que precisamos, mas ainda tem alguns pontos para melhorar e transformar isso num full-adder e, aí sim, somar 1+1.
Por enquanto, é só isso. Amanhã voltamos com mais para continuar a nossa série!