Afinal, o que são os 0's e 1's?
Tags: digital, electronics, computerscience, circuits
Published: 2024-06-14 22:15:43

Você já deve ter ouvido por aí que o computador "só entende 0's e 1's". Mas **de onde vem esses 0's e 1's**? O que eles representam?

---

## Analógico vs. Digital

Antigamente, os sistemas eletrônicos lidavam com a informação de forma analógica, ou seja, os sinais elétricos que representavam a informação podiam assumir uma infinidade de amplitudes de tensão.

![Representação de sinal analógico](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ttx0nukms0f4npxcnu9.png)

Exemplo: Rádio AM, Rádio FM, TV Analógica.

![Televisão Analógica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eebpmeppu1pw0dckqcym.png)

Todos os sistemas são suscetíveis a ruído, e para informação representada de modo analógico, isto é um grande problema, pois o processamento de sinais analógicos depende de alta precisão na amplitude, a qual é bastante afetada pelo ruído.

![Representação de sinal analógico e influência do ruído](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mwyak65gm4cn7qifuv3e.png)

<sup><sub>Fonte: https://www.predig.com/whitepaper/reducing-signal-noise-practice</sub></sup>

A codificação digital veio como uma forma de reduzir erros decorrentes do ruído, e para isso, a informação é representada apenas em regiões de tensão bem definidas.

(Isso não significa que sistemas digitais são totalmente imunes a erros.)

![Representação do sinal digital e maior imunidade a ruído](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cruyuv2yliivi4jcrznr.png)

<sup><sub>Fonte: https://www.predig.com/whitepaper/reducing-signal-noise-practice</sub></sup>

---

## Sinal digital

No geral, um sinal digital pode assumir dois níveis de tensão:

- 0 V, ao qual atribuímos o valor lógico 0;
- 5 V / 3,3 V / 1,8 V / etc. (dependendo da tecnologia de implementação), ao qual é atribuído o valor lógico 1.


![Representação de sinal digital](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zrw22udcoibnq9naoyf9.png)

Em computação, o "valor lógico" é chamado de `bit` (abreviação de _binary digit_, ou dígito binário).

Todos aqueles 0's e 1's dos quais você ouve falar são representados fisicamente pelo fluxo de sinais elétricos, os quais são controlados por meio de dispositivos eletrônicos.

![Representação abstrata de zeros e uns](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcheynjlsk261ga1yzd4.png)

---

## Transistores e Portas Lógicas

Em circuitos digitais modernos, os dispositivos utilizados para controlar tais sinais são os transistores.

Transistores são compostos de materiais semicondutores dispostos de maneira inteligente, de modo que podem ser utilizados como chaveadores.

![Representações de transistores](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3yo4tex4pww4484e8pk.png)

"Ah, mas como assim chaveadores?"

Pense em um interruptor de lâmpada: podemos **LIGÁ-LO** ou **DESLIGÁ-LO**.

Do mesmo modo, o transistor pode ser controlado para permitir ou bloquear a passagem de corrente elétrica.

![Interruptor de lâmpada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjhb9zx6h3izmn4mkkyz.png)

Os transistores são utilizados para construir arranjos levemente mais complexos, aos quais chamamos de "portas lógicas".

Tais componentes recebem sinais digitais de entrada e retornam um sinal digital como saída, executando uma operação lógica.

![Portas lógicas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql00nvs4bi24582t2gc5.png)

Antes de partir para as portas lógicas:

Assim como chamamos os dois estados de um interruptor de **LIGADO** e **DESLIGADO**, também podemos atribuir significado ao 1 e ao 0, aos quais geralmente chamamos de **TRUE** e **FALSE** (**VERDADEIRO** e **FALSO**), respectivamente.

---

### Porta lógica AND

A porta lógica AND (em português, E) recebe várias entradas e retorna uma saída.

Tal porta retorna verdadeiro (1) se todas as entradas são verdadeiras (1) ao mesmo tempo; caso contrário, ela retorna falso (0).

Q = A e B

![Porta lógica AND](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kq8tp7dlnmzkr6gz0l96.png)

---

### Porta lógica OR

A porta OR (OU) funciona de outra forma:

Dentre as várias entradas, basta que pelo menos uma delas seja verdadeira (1) para que a saída seja verdadeira (1)

Q = A ou B

![Porta lógica OR](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2hoo3bjw5hbjinpritqr.png)

---

### Porta lógica XOR

A porta XOR (OU EXCLUSIVO) funciona de forma diferente: Dadas duas entradas, apenas uma das duas deve receber um sinal verdadeiro (1) para que a saída seja verdadeira (1), o que significa: OU A, OU B (A E B ao mesmo tempo retorna 0)

Q = ou A, ou B

![Porta lógica XOR](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aly9rjefmi6dnu1y0ots.png)

---

### Porta lógica NOT

A porta NOT (NÃO) recebe apenas uma entrada, e como o próprio nome diz, o estado lógico da entrada é invertido na saída

Q = não A

![Porta lógica NOT](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10vaw6o1gprjo9ua6app.png)

---

### Porta lógica NAND

A porta NAND (NÃO E) é literalmente o contrário da porta AND: só sai falso (0) se todas as entradas forem verdadeiras (1) ao mesmo tempo. É basicamente a mesma coisa que pegar uma porta AND e colocar uma porta NOT na saída.

Q = não (A e B)

![Porta lógica NAND](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m7d943ippup2bcjrnxuw.png)

---

### Porta lógica NOR

Do mesmo modo, a porta NOR (NÃO OU) é o contrário da porta OU: basta que pelo menos uma das entradas seja verdadeira (1) para que a porta retorne falso (0). É basicamente a mesma coisa que pegar uma porta OR e colocar uma porta NOT na saída.

Q = não (A ou B)

![Porta lógica NOR](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxx2sn0bzmhn4pxr3kdh.png)

---

### Porta lógica XNOR

A porta XNOR (NÃO OU EXCLUSIVO) também é chamada de "porta coincidência", pois ela retorna verdadeiro (1) se suas duas entradas forem iguais. É a mesma coisa de pegar uma porta XOR e colocar uma porta NOT na frente.

Q = não (ou A, ou B)

![Porta lógica XNOR](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/203matsgsdno1f7bwmhz.png)

---

## Paralelo entre portas lógicas e programação

Em programação, podemos pensar nos laços condicionais como "aplicações de portas lógicas".

Geralmente, quando programamos um `if`, estabelecemos condições para que um determinado bloco de código seja executado. Cada condição pode ser pensada como um bit (0 se for falsa, 1 se for verdadeira). Podemos fazer operações com esses bits, como se estivéssemos usando portas lógicas. Na maioria das linguagens de programação, podemos usar os operadores `&&`, `||` e `!` para as operações **AND**, **OR** e **NOT**, respectivamente. Estes operadores são chamados de **operadores lógicos**.

![Exemplo de condicionais em programação](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/45dz2hjnbx2ruq1x1c8w.png)

Para além das condicionais, podemos utilizar operações correlatas às portas lógicas para comparar números bit a bit por meio dos **operadores _bitwise_**. Para tratar deste assunto com mais profundidade, é necessário explicar sobre sistemas de numeração, o que provavelmente será feito em um artigo futuro.

---

## Associações de portas lógicas

Portas lógicas podem ser associadas e conectadas entre si para formar circuitos mais complexos. No geral, é possível construir dois tipos de circuitos:

- **Circuitos combinacionais**, que propagam os sinais de entrada pelas portas lógicas até a saída, sem realimentação;
- **Circuitos sequenciais**, que possuem realimentação arranjada de forma inteligente, formando as peças básicas que constituem o que conhecemos como **memória**.

Um exemplo de circuito combinacional é o circuito da imagem abaixo (as bolinhas nas entradas representam portas NOT). Os circuitos sequenciais provavelmente serão tratados em um futuro artigo.

![Exemplo de circuito lógico](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l02jcypd3elpt3ipggcv.png)

---

## Álgebra Booleana

Além de diagramas, podemos representar os circuitos combinacionais como expressões algébricas, com base na **Álgebra Booleana**.

A álgebra booleana foi criada por George Boole, um matemático inglês, durante o século XIX. Com o tempo, o trabalho de Boole se provou útil para representar algebricamente as possíveis relações e operações envolvendo informações binárias.

Representando as portas lógicas por meio da álgebra booleana:

| Porta lógica | Expressão algébrica |
|--------------|---------------------|
| **NOT** | {% katex inline %} Q = \overline{A} {% endkatex %}, ou {% katex inline %} Q = A' {% endkatex %} |
| **AND** | {% katex inline %} Q = A \cdot B {% endkatex %} |
| **NAND** | {% katex inline %} Q = \overline{A \cdot B} {% endkatex %}, ou {% katex inline %} Q = (A \cdot B)' {% endkatex %} |
| **OR** | {% katex inline %} Q = A + B {% endkatex %} |
| **NOR** | {% katex inline %} Q = \overline{A + B} {% endkatex %}, ou {% katex inline %} Q = (A + B)' {% endkatex %} |
| **XOR** | {% katex inline %} Q = A \oplus B {% endkatex %} |
| **XNOR** | {% katex inline %} Q = A \odot B {% endkatex %} |

Assim como em expressões aritméticas, expressões booleanas também possuem suas propriedades de operação, algumas delas representadas abaixo.

![Tabela de leis da álgebra booleana](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fullskapoe8awmaqxig.png)

---

## Bilhões de portas lógicas!

Circuitos integrados, ou chips, como são popularmente conhecidos, costumam conter circuitos muito mais complexos e com bilhões de transistores formando um incrível número de portas lógicas, arranjadas de modo inteligente para executar várias funções.

![Imagem abstrada de circuito integrado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50b97heegtplqhkilh4t.png)

Tomemos como exemplo processadores de computador e de smartphone: várias portas lógicas são arranjadas para formar a Unidade Lógica e Aritmética (ULA), a qual é responsável por efetuar operações matemáticas; Registradores, que guardam temporariamente dados que são utilizados para executar instruções; a Unidade de Controle, que é responsável por disparar os sinais elétricos responsáveis por gerenciar o fluxo de dados no processador e comunicação do processador com periféricos; dentre outras funcionalidades.

![Imagem dos pinos de um processador](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2f02yph3tuhiefery9a6.png)

Caso tenha curiosidade em entender melhor como é o processo de fabricação de microchips, recomendo o seguinte vídeo:

{% embed https://www.youtube.com/watch?v=dX9CGRZwD-w %}