Binários!
Tags: computerscience, programming, assembly, webdev
Published: 2021-11-15 17:08:00

Em um dos meus posts anteriores, dei uma explicação sobre Charset e também sobre Codificação, que você pode conferir [aqui](https://dev.to/tttecnology/charset-vs-codificacao-14gc). Relembrando: charset é a tabela que relaciona uma determinada numeração com um caractere (entre elas a tabela ASCII, UTF-16, etc.), possibilitando que o computador leia e escreva palavras, e codificação é o processo de transformar essa numeração em binário. Porém, o assunto dos números binários pode gerar dúvida em muita gente, afinal, por quê binário? Por quê tudo em baixo nível é binário?

Antes de mais nada, o binário não é muito diferente de decimal, sendo que o que diferencia um do outro é a base utilizada. Decimal utiliza base 10 na representação e operações dos números, enquanto o binário utiliza a base 2. Assim, os números são representados como uma sequência de 0 e 1, enquanto em base 10 os números são representados com os numerais de 0 a 9.

Podemos utilizar qualquer base para representar os números. Em computação, comumente utilizamos o hexadecimal, que é com base 16. 
Nesse sistema, os números de 0 a 9 são representados com numerais mesmo. Do 10 ao 15, já são representados com letra de A a F. Alguns erros que o Windows produz retorna uma numeração hexadecimal (que seria um endereço de memória), e, inclusive, o algoritmo de hash SHA-1 produz um número em hexadecimal para cada documento que é passado para ele (confira mais [aqui](https://www.geeksforgeeks.org/sha-1-hash-in-java/))

![Erro no Windows](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tfarb6gl4ut7la7vi7qh.png)
*Acho que temos um pouco mais de base para entender o porquê de alguns erros do Windows terem essa numeração estranha*



O Javascript mesmo é uma linguagem que aceita conversões com limite de base 36, isso porque existem 10 numerais e 26 letras do alfabeto.

>O método toString() analisa seu primeiro argumento e tenta retornar uma representação string na raiz (base) especificada. Para raizes maiores que 10, as letras do alfabeto indicam valores maiores que 9. Por exemplo, para números hexadecimais (base 16),  letras entre a e f são utilizadas.
Se o radix não for especificado, a raiz assumida como preferencial é a 10.  

Fonte: [MDN Docs](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)

Dito isso, para facilitar entender um sistema numeral de base 2, acredito que convém entender um tipo primitivo de dado: o Boolean.

O Boolean é implementado na maioria das linguagens de programação, e, quando não, através de bibliotecas. Um dado Boolean tem apenas duas possibilidades: True ou False. Apenas isso. Utiliza-se o Boolean para muitas operações de igualdade e comparação, pois, a partir daí, define-se uma execução de uma estrutura de decisão ou condicional.

![Estrutura de Decisão](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9f116jpli6prt3hzut3x.gif)
*Uma estrutura de decisão utiliza Booleans de forma implícita*

A linguagem C não possui uma implementação explícita de dados do tipo Boolean, porém é bastante implícito. Como exemplo, defini uma estrutura de decisão em C onde é necessário comparar dois dados para executar uma função:

```
if (x > 20){
  printf("%d é maior que 20", x);
}
//A instrução acima é simples: se x for maior que 20, 
//então vai mostrar na tela o texto definido pela 
//função "printf".
```

Neste caso, verificar se x será maior ou não que 20 implica em determinar se essa declaração (x > 20) é verdadeira ou falsa. 

O que o Boolean tem a ver com números Binários?
O Boolean utiliza apenas 1 bit para determinar True/False (1 bit é a unidade atômica de informação no computador, correspondendo a um 0 ou 1). De forma correspondente, 1 será True e 0 Falso. 

Se pegarmos então uma linha enorme de uma numeração de 16 bits (16 dígitos de 0 ou 1), para cada bit haverá ou um True ou um False, assim:

**0000000000000100**

A nível de hardware, essa sequência de 0s e 1s é representada por correntes elétricas. Então se a corrente elétrica está passando em uma determinada voltagem (True), quer dizer que é 1. Caso contrário, ou seja, a corrente elétrica esteja passando uma voltagem menor ou não esteja passando nenhuma voltagem (False), quer dizer 0.

Historicamente, este é o método principal para leitura e escrita de dados, desde a época dos cartões perfurados, em que literalmente se escovava bits (confira o artigo do Wikipedia [aqui](https://en.wikipedia.org/wiki/Bit)).

Por fim, o processo de codificação, como já falado, converte números decimais em binários. Abaixo descrevo, como fazer esse processo:

###Convertendo de decimal para binário

Binário é um sistema numérico de base 2, como já falado. Então, para realizar a conversão, temos que realizar uma sucessão de divisões do número que queremos converter por 2 e anotar os resultados, tanto o quociente quanto o resto das divisões. Assim:

>658 / 2 = resultado: 329 | resto = 0
>329 / 2 = resultado: 164 | resto = 1
>164 / 2 = resultado:  82 | resto = 0
> 82 / 2 = resultado:  41 | resto = 0
> 41 / 2 = resultado:  20 | resto = 1
> 20 / 2 = resultado:  10 | resto = 0
> 10 / 2 = resultado:   5 | resto = 0
>  5 / 2 = resultado:   2 | resto = 1
>  2 / 2 = resultado:   1 | resto = 0
>  1 / 2 = resultado:   0 | resto = 1

Como podemos observar, as divisões são realizadas até que o resultado seja 0. O número binário será formado pelos restos, da seguinte forma:

**0100100101**

Como o computador lê a precedência dos números binários da direita para a esquerda, então temos que inverter essa numeração para chegarmos ao resultado final:

**1010010010**

Caso queira conferir, abra o console do seu navegador (pressione F11 e procure pelo menu "console") e digite "0bxxxxxxx", substituindo onde está com x pelos números binários e aperte "enter", conforme abaixo:

![Inserindo número binários em Javascript](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wkk2ww2fia2gn3a0qsv.png)

Os passos acima podem ser convertidos em um algoritmo de programação. Então, fiz esse pequeno programa em C com os mesmos passos descritos.

```
#include <stdio.h>

char* dec2Bin(int number, char return2[17]){
  int dec = number;
  for(int i=1; dec != 0; i++){
    return2[16-i] = (char)dec%2 + '0';
    dec /= 2;
  }
  return return2;
}

int main(){
    int number = 0;
    char return1[17] = "0000000000000000";
    printf("Escreva o número: \n");
    scanf("%d", &number);
    dec2Bin(number, return1);
    printf("%s", return1);
    return 0;
}
```

###Convertendo de binário para decimal

Para converter de binário para decimal, primeiro, temos que inverter o número que temos em binário para ser compatível 
com a leitura humana:

1010010010 >> 0100100101

Feito isso, vamos numerar cada um dos índices do número, como um array:

0 1 0 0 1 0 0 1 0 1
0 1 2 3 4 5 6 7 8 9

Lembrando: **o índice deve começar do 0!**

Feito isso, os campos que forem 1, efetuar a exponenciação de 2 elevado ao índice dele e somar os resultados, assim:

0 **1** 0 0 **1** 0 0 **1** 0 **1**
0 **1** 2 3 **4** 5 6 **7** 8 **9**

2 ^ 1 = 2
2 ^ 4 = 16
2 ^ 7 = 128
2 ^ 9 = 512
**Total = 658**

Igualmente com a conversão Decimal > Binário, os passos acima também podem ser convertidos em algoritmo de programação, como o código em C abaixo:

```
#include <stdio.h>
#include <string.h>
#include <math.h>

int bin2Dec(char bin[17]){
  int finalNumber = 0;
  int tam = strlen(bin);
  for(int i=0; i<tam; i++){
    finalNumber += pow(2,(tam-i-1))*((int)bin[i]-'0');
  }
  return finalNumber;
}

int main(){
    int number = 0;
    char binary[17];
    printf("Escreva o número: \n");
    setbuf(stdin, NULL);
    fgets(binary, 16, stdin);
    binary[strcspn(binary, "\n")] = 0;
    number = bin2Dec(binary);
    printf("%d", number);
    return 0;
}
```

###Finalmente...

Vimos que o processo de codificação é converter do decimal ao binário. Entender um boolean, na minha opinião, facilita muito entender como um número binário funciona.
O sistema padrão de representação de qualquer coisa no computador é binário, muito pela simplicidade e também por construção histórica. Para possibilitar o uso, tudo no computador passa pelo processo de codificação, que é converter para a representação binária tudo o que é mostrado em tela.
Ter um entendimento disso, ao menos básico, nos facilita entender porque os computadores são verdadeiras máquinas de Turing, mas este assunto é para outro post.