Binário

Bits, bytes e unidades de medida

Tudo o que fazemos e armazenamos em um computador e em seus periféricos, é processado internamente numa sequência de zeros e uns (bits). A base 2 (sistema binário) é o que a computação utiliza para representar números, caracteres, imagens e tudo mais. Nesse artigo veremos o conceito de bit e byte e como eles são usados para representar as informações.

Antes, entretanto, veremos bem brevemente os principais sistemas de numeração usados na computação.

Sistemas de numeração

Os sistemas de numeração mais relevantes para os sistemas digitais são:

  • Binário (base 2)
  • Hexadecimal (base 16)
  • Octal (base 8)

Veremos um pouco sobre cada um deles, sem adentrar em assuntos filosóficos, históricos ou matematicamente técnicos em relação aos seus cálculos ou conversões, focando mais em suas definições. Esse entendimento é base pra compreender operações lógicas, unidades de medida como bits, bytes etc, bem como compreender os sistemas ASCII e Unicode de representação de caracteres.

Um sistema de numeração é um conjunto de princípios para classificar em grupos e subgrupos as unidades que formam os números. A base numérica é o centro de todo sistema de numeração posicional. A base de um sistema é a quantidade de algarismos disponíveis para sua representação. Por exemplo, na padaria quando pedimos uma dúzia de ovos (estamos lidando com a base 12) e quando lidamos com tempo em minutos e segundos (usamos a base 60). Não é novidade que o sistema mais utilizado por seres humanos é o decimal (base 10), então começaremos por ele.

Sistema decimal

Nesse sistema temos os algarismos indo-arábicos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 que usamos para contar unidades, dezenas, centenas etc, da direita para a esquerda.

Por exemplo, o algarismo 764 é uma abreviação da expressão:

(7*100) + (6*10) + 4 = (7*10^2) + (6*10^1) + (4*10^0) = 764

Sistema decimal

Sistema binário

O sistema binário usa a base 2. E que, portanto, utiliza apenas dois dígitos diferentes para representar seus algarismos: 0 e 1. Esse é o sistema que a computação e a eletrônica digital utilizam. Não obstante, ele é a base da álgebra booleana e de suas operações lógicas.

Normalmente quando falamos em binário a gente pensa em dois estados: ligado ou desligado. Verdadeiro ou falso. Sim ou não.

Por exemplo, o decimal 26 convertido para binário é 11010 que é uma abreviação da expressão:

(1*2^4) + (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = (1*16) + (1*8) + (0*4) + (1*2) + (0*1) = 26

Sistema octal

Esse sistema usa a base 8. Ele já foi mais usado na computação como uma alternativa mais compacta ao binário, hoje, o que vemos, é um maior uso do sistema hexadecimal como alternativa ao binário.

Por exemplo, o decimal 16 convertido para octal é 20 que é uma abreviação da expressão:

(2*8^1) + (0*8^0) = (2*8) + 0 = 16

Sistema hexadecimal

Esse sistema usa a base 16, ou seja, ele emprega 16 símbolos. Ele é talvez o sistema mais usado atualmente para representar binário de uma forma mais compacta. Não é incomum vermos utilização de hexadecimais em linguagens de programação.

Devido ao fato do sistema decimal dispor apenas de 10 algarismos, esse sistema inclui seis letras do alfabeto para completar a sua composição, ficando assim:

S = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}

Um dígito em hexadecimal pode representar um número binário de 4 dígitos, ou seja, para transformar um binário em hexadecimal, basta que separemos o binário em grupos de 4 bits (quatro zeros e uns), começando pela direita.

Por exemplo:

O decimal 65000 convertido para binário é 1111110111101000, separando em grupos de 4 bits e convertendo primeiro para decimal e por fim para hexadecimal, temos:

1000 =  8 -> 8
1110 = 14 -> E
1101 = 13 -> D
1111 = 15 -> F

Portanto, o decimal 65000 para hexadecimal é FDE8.

Da mesma forma, tendo um valor hexadecimal, podemos chegar na sua representação binária, fazendo o processo inverso ao que fizemos anteriormente.

Tabela de conversão

DecimalBinárioHexadecimal
000000
100011
200102
300113
401004
501015
601106
701117
810008
910019
101010A
111011B
121100C
131101D
141110E
151111F

Conceito de bit e byte

Um bit (binary digit), é a menor e mais elementar unidade que os computadores utilizam para trabalhar. Ele pode assumir apenas dois valores: 0 ou 1. Fisicamente, um bit pode ser representado de várias formas: via eletricidade (dois valores de voltagem aplicados num fio), via luz (em fibras ópticas), via ondas eletromagnéticas (redes sem fio), enfim, em tudo que seja possível identificar dois estados diferentes.

Exemplos de representações “binárias” do nosso mundo real:

  • Uma porta: fechada ou aberta;
  • Uma lâmpada: acesa ou apagada;
  • Estado civil: solteiro ou casado;

Já o byte, é a menor unidade de armazenamento utilizada pelos computadores. Um byte é uma sequência de 8 bits. Ou seja, não é possível salvar menos do que 8 bits. Por exemplo, em uma tabela de banco de dados onde você tem uma coluna do tipo tinyint, quando salvamos o número 0 nela, estamos na prática usando 1 byte e não 1 bit. O próprio tipo tinyint já especifica que ele usa 1 byte de armazenamento, não importando se você vai salvar nele o número 1 ou o 255.

Todo dispositivo de armazenamento indica o número de bytes (8 bits) que ele pode conter. Algumas unidades de medida facilitam esse agrupamento:

UnidadeSímboloNúmero de bytes
kilobyteKB2^10 = 1024 bytes
megabyteMB2^20 = 1,048,576 bytes
gigabyteGB2^30 = 1,073,741,824 bytes
terabyteTB2^40 = 1,099,511,627,776 bytes
petabytePB2^50 = 1,125,899,906,842,624 bytes
exabyteEB2^60 = 1,152,921,504,606,846,976 bytes
zettabyteZB2^70 = 1,180,591,620,717,411,303,424 bytes
yottabyteYB2^80 = 1,208,925,819,614,629,174,706,176 bytes

Sendo que as unidades mais comuns do nosso dia a dia são as quatro primeiras.

Velocidade de transferência

Existe uma confusão bastante comum entre os consumidores de internet em relação a unidade de medida da velocidade de transferência. Quando você contrata aquela internet de fibra óptica de 100MB, que você lê que poderá baixar a “100 mega por segundo”, pode parecer que será possível baixar um arquivo de 100 megabytes em 1 segundo, mas isso não é verdade. Velocidade de transferência é medida em bits por segundo e não em bytes. Portanto, um download a 100mbps significa 100 megabits por segundo e não 100 megabytes.

Para se chegar no valor em megabytes, é preciso dividir por 8. Ou seja, quando você baixa a 100mbps, você está na prática baixando 100/8 = 12,5 megabytes por segundo.

Concluindo

E aqui finalizamos o artigo, que teve uma abordagem leve, pouco técnica e bem direto ao ponto. Mas essas são noções fundamentais da informática.

Recomendo que você assista o vídeo: Why Use Binary?

Até a próxima!

Uma introdução a ASCII e Unicode

No artigo bits, bytes e unidades de medida vimos que os computadores representam números, imagens e tudo mais através de zeros e uns. E não é diferente com textos, é preciso que exista um sistema de codificação que faça a conversão de letras e caracteres para números, para que depois o computador possa ter a representação binária disso.

Ou seja, tudo o que o computador vai processar precisa ser convertido para bytes, afinal. É aí que entra a tabela ASCII (sigla para Código Padrão Americano para o Intercâmbio de Informação), um sistema de codificação de caracteres que foi adotado em larga escala na computação. A primeira tabela ASCII usava um código de 7 bits e deixava o oitavo bit liberado para outros fins (de checagem de erros de transmissão), o que fez com que ela pudesse representar no máximo 128 caracteres.

Tabela ASCII

Tabela ASCII 7 bits

O “a” minúsculo que você digita no teclado é representado na tabela pelo decimal 97, mas internamente o computador trabalha isso em binário, ou seja, com 8 bits 01100001 (97 em decimal).

Faça esse teste: crie um arquivo de texto e coloque nele apenas a letra a. Depois de salvá-lo, o seu sistema operacional vai reconhecer que ele ocupa apenas 1 byte (8 bits):

One Byte

Se você adicionar mais um caractere de 8 bits, como o b, ele vai contabilizar 2 bytes.

Ainda lá nos anos 60 notaram a necessidade de normalizar a tabela para usar os 8 bits disponíveis (1 byte), que era o sistema mais usado na época. Criaram uma versão estendida da ASCII e então ela passou representar até 256 caracteres. Além dos caracteres da versão original, a estendida dispõe de alguns novos símbolos e caracteres gráficos:

Tabela ASCII 8 bits

O problema, e você já deve ter notado, é que a tabela ASCII não consegue representar os símbolos de outras línguas como a hebraica, arábica, grega, japonesa e até mesmo alguns símbolos latinos, como alguns da nossa língua portuguesa.

Foi então que no início dos anos 90 surgiu o Unicode, bem no advento da internet, momento crucial em que a informática passou a necessitar de um padrão universal de representação de texto, para que o tráfego das informações ficasse inteligível em todos os computadores, não importando o idioma de escrita.

Unicode

O Unicode faz parte do ISO 10646 e é o padrão de representação de texto mais usado. Uni em latim significa um, Unicode remete à ideia de um padrão universal de codificação de caracteres. Ele foi projetado com base no código ASCII, com a diferença que ele é capaz de codificar quase todos os caracteres e símbolos presentes nas mais variadas línguas do mundo, até mesmo aquele emoji que você tanto curte, ele consegue representar. Existem diversos sistemas de codificação Unicode e hoje (junho 2020) eles conseguem representar mais de 143 mil caracteres. Unicode nos permite usar 8, 16 e até 32 bits (mais de 2 bilhões de caracteres possíveis).

Você pode experimentar salvar um caractere unicode no disco, como esse aqui:

😍

Ele vai ocupar 4 bytes, ou seja, estará usando 32 bits.

Unicode mapeia cada caractere para um código específico chamado de code point que tem o formato U+<código hexadecimal> numa faixa de U+0000 a U+10FFFF.

Alguns caracteres representados em Unicode e ASCII:

UnicodeASCII (decimal)Caractere
U+002133!
U+002436$
U+002638&
U+002A42*

Para ter acesso a uma lista completa de caracteres unicode, tem uma ótima referência na wikipedia.

UTF-8

O encoding da família Unicode mais amplamente usado e difundido em sistemas operacionais, web e linguagens de programação é o UTF-8, que foi co-criado no início dos anos 90 por um dos arquitetos da linguagem Go (Rob Pike). Além disso, UTF-8 é o encoding padrão adotado pela W3C para a Web e ele é 100% compatível com a tabela ASCII.

Ele é um padrão de encoding variável e pode usar de 1 até 4 bytes, a depender do caractere que se está representando. Ele resolve o problema de não se fixar 32 bits para todos os caracteres, o que naturalmente faria um texto escrito em inglês ocupar um espaço muito maior do que ele poderia ocupar.

No seu HTML quando você indica:

<meta charset="utf-8">

Você está dizendo pro navegador que sua página utiliza esse encoding.

Nas linguagens de programação

Go é um exemplo de linguagem moderna que adota a codificação UTF-8 por padrão (e não poderia ser diferente, já que o Rob Pike é um dos arquitetos dela):

package main

import "fmt"

func main() {
    fmt.Println("嗨")
    fmt.Println("Cześć")
    fmt.Println("Coração")
}

Hoje em dia a maioria das linguagens possuem um bom suporte a Unicode, o que não necessariamente quer dizer que elas o suportem na escrita de declarações, nomes de variáveis etc. Mas Go, PHP, entre outras suportam.

https://play.golang.org/p/ANEgJAFStmX

package main

import "fmt"

func こんにちは() {
    fmt.Println("Hello")
}

func main() {
    こんにちは()
}

Um exemplo em PHP:

<?php

$こんにちは = "Hello";

echo $こんにちは;

No PHP, para imprimir um caractere unicode através do seu code point, basta usar essa sintaxe:

<?php

echo "\u{1F648}"; // 🙈

O código desse emoji e de outros você pode obter no site Unicode Table.

Exemplo em Go que imprime uma lista de emojis a partir da faixa de seus códigos Unicode: https://play.golang.org/p/yPgKw3Z9HW

Concluindo

Vimos apenas a superfície do que são os padrões de codificação de caracteres. São bem mais complexos e amplos que isso, em especial o Unicode. Mas o que vimos aqui é o essencial que todo desenvolvedor precisa saber.

Recomendo que você assista o vídeo Characters, Symbols and the Unicode Miracle.

Até a próxima!

© 2004 - 2019 TreinaWeb Tecnologia LTDA - CNPJ: 06.156.637/0001-58 Av. Paulista, 1765, Conj 71 e 72 - Bela Vista - São Paulo - SP - 01311-200