test · 11/01/2023, 0:00:00

Binário

Como fiz para entender binário

Bit

Um Bit é a forma mais básica possível para se representar dados. Um bit pode conter o apenas o valor 0 ou 1. Usando uma cadeia de bits podemos representar números, usando a base binária(2). Estamos habituados a conviver com a base decimal(10), que varia dos números 0-9, mas o computador não tem tudo isso, apenas zeros e uns, então, como os números são armazenados?

Imagine num país hipotético em que o sistema de moedas funciona da seguinte forma:

  • A moeda de mais baixo valor é 1
  • A próxima nota é o dobro do valor da anterior.

Por exempo, as cinco notas com valor mais baixo deste país são: 1 -> 2 -> 4 -> 8 -> 16. .

Tamanho

Imagine que você é um cidadão desse país hipotético, e que possui apenas uma as quatro primeiras notas (1, 2, 4 e 8). Quanto você tem no total? Para saber isso você poderia somar todos os valores, 1 + 2 + 4 + 8 = 15, não está errado, mas existe uma formula mais fácil para cálcular a quantidade máxima, basta usar 2^n - 1, onde n é o número de notas que possui. Desta forma temos: 2^4 => 16 - 1 = 15.

Usando somente essas 4 notas você é capaz de representar qualquer valor entre 0 e 15, basta usar a combinação correta de notas.

Representando Números

Imagine que você queira comprar um sorvete, e que este custa $B 3. Para comprar basta usar a nota de 1 e 2. , agora imagine que outro produto custe $B 13, a primeira vista pode parecer que não tem como comprar o produto sem precisar que o vendedor tenha troco, mas espere um momento. Se combinarmos as notas de 8, 4 e 1. teremos exatamente $B 13.

Mas onde isso se conecta a binário? Vamos traduzir as transações acima para binário. Basicamente vamos dizer que:

  • Cada nota é equivale a um bit, então 4 notas são 4 bits.
  • Por padrão, todos os bits tem o valor de 0.
  • Ao usarmos uma nota o valor do bit muda para 1, caso contrário o valor se mantem como 0.
  • O valor mais baixo da moeda fica na direita, enquanto o maior na esquerda.

Para representar a compra do sorvete em binária faremos:

Moeda8421
Bits0011

Está aí, o valor de 3 em binário é 0011, agora para reprentar a compra de $B 13:

Moeda8421
Bits1101

E é desta forma que representamos o número 13 em binário. Bem simple não?

Byte

Um byte é simplesmente 8 bits em sequencia, então com 1 bytes podemos representar 2^8 números, ou 256 (contando com o 0).

Se adicionarmos 1 bit a mais no byte, irmos de 8 para 9, o valor máximo dobra, de 256 números passamos para 512. Isso parece trivial, porem as coisas ficam não intruítivas quando dobramos o número de bits, pois ao fazer isso o número máximo que podemos representar é elevado ao quadrado. Ou seja, se pularmos de 1 byte (8 bits) para 2 bytes (16 bits). Vamos de 256 números para 65536, um salto enorme.

Uso

O tipo Int geralmente representa um inteiro de 32 bits (ou 4 bytes). Isso o torna capaz de representar 4294967296 números diferentes, um número realmente grande, porem não é nem o maior, o tipo long é capaz de representar 64 bits (ou 8 bytes), que são os absurdos 1.8446744073709552e+19. Mas Denovo, ele ainda não é o maior. Algumas linguagens suportam o long long, ou seja, 128 bits (ou 16 bytes), 3.402823669209385e+38, um pouco mais de 3 quatrilhões.

Números Negativos

Para representar os números negativos usamos o 0 mais a esquerda. Vamos usar como exemplo um simples número de 4 bits.

Como vimos antes, um número de 4 bits pode representar 16 números diferentes (incluindo o 0), porem, todos esses são positivos. Para os números negativos alocamos o bit mais a esquerda como sinal, se for 0 então o número é positivo, se for 1 o número é negativo. Mas isso tem implicações, como o bit mais a esquerda não representa mais um número, o valor máximo que podemos representar é 2^3 - 1 => 7. Veja:

Moedasinal421
Bits0111

O valor máximo se torna 7. Porem, se mudarmos o bit de sinal para 1 podemos represenar números negativos até -8, então fazemos uma troca, metade do valor máximo para poder usar números abaixo de 0.

É por isso que algumas linguagens tem suporte para signed e unsigned, ao usar unsigned, estamos dizendo para a linguagem que não queremos esse bit de sinal, e que um valor deve ser usado no lugar dele. Signed é o valor padrão e usa esse bit de sinal.