Binário, a aventura final, ou implementando os algoritmos de conversão

Computação Python Linguagem Python Algoritmos
Binário, a aventura final, ou implementando os algoritmos de conversão
Lucas Virgili
em 21 de Abril de 2014

 Previously, on LV's binary's saga

Nos meus dois últimos posts , expliquei como funciona a famosa base 2, ou números binários, e como nós podemos converter números da base 10 para a base 2 e vice-versa. Se você ainda não leu (como não?!), vai lá dar uma lida que eu espero!

O algoritmo para ir da base 2 para a base 10

Agora que você já sabe converter da base 2 para a base 10 na mão, você também já sabe o algoritmo! Coincidência, não?

Afinal, só precisamos, a partir da unidade (o dígito mais à direita do número), multiplicar o coeficiente pela potência de 2 adequada e somar tudo! Por exemplo:

101010 = (1 × 25) + (0 × 24) + (1 × 23) + (0 × 22) + (1 × 21) + (0 × 20)

Vamos escrever o programa que faz essa conta, para isso, usaremos a linguagem python (padrão 3), já que ela é bem simples:

1
2
3
4
5
6
7
8
9
10
def binario_para_decimal ( n ):
    numero_em_decimal = 0
    expoente = 0
    while n > 0:
        dig = n % 10
        n = n // 10
        numero_em_decimal += dig * ( 2 ** expoente )
        expoente += 1

    return numero_em_decimal

 

Vamos entender o programa:

  • Na linha 1 definimos a função, que é muito criativamente chamada de "binario_para_decimal". Ela recebe um número n como parâmetro, que nós assumimos que é um número em binário;

  • As linhas 2 e 3 inicializam a variável numero_em_decimal, que armazena, impressionantemente, o número em decimal, e o expoente da potência de 2 que estamos usando.

A variável número em decimal é inicializada com 0, pois vamos somar cada um dos dígitos multiplicados pela sua potência de 2, sendo 0 o elemento neutro da adição. Já expoente começa com 0 pois é o primeiro expoente!

  • Nas linhas 4 a 8, fazemos a mágica da transformação em si! Para conseguirmos o dígito certo de n, basta calcularmos o resto de sua divisão por 10, o que fazemos na linha 5. Na linha 6, nós dividimos n por 10, já que não precisamos mais do dígito que acabamos de armazenar na variável dig.

Na linha 7, nós somamos o dígito multiplicado pela potência de 2 correta, que é marcada pela variável expoente, a qual nós aumentaremos toda vez que fizermos uma conta.

  • Para acabar, retornamos o valor armazenado na variável numero_em_decimal na linha 10.

Vejamos alguns exemplos:

print(binario_para_decimal(111))
# Imprime 7
print(binario_para_decimal(101010))
# Imprime 42
print(binario_para_decimal(100))
# Imprime 4
print(binario_para_decimal(111111))
# Imprime 63

Fácil, certo? Simplemente "traduzimos" a soma que a gente já sabia para python!

There and back again

Agora que sabemos ir da base 2 para a base 10, vamos fazer o caminho inverso!

Felizmente, converter um número para binário é muito fácil, já que só precisamos dividir o número por 2 até não poder mais e pegar os restos, como já tinhamos visto antes.

A figura abaixo vai (de novo!) ajudar a gente:

Vamos direto ao código dessa vez, já que só vamos dividir o número e colocar na nossa lista!

1
2
3
4
5
6
7
8
9
10
11
12
13
def decimal_para_binario ( n ):
    resto = n % 2
    lista =  [ resto ]
    n = n // 2
    while n != 0:
        resto = n % 2
        lista.append(resto)
        n = n // 2

    lista.reverse()
    lista = map(str, lista)
    numero = "".join(lista)
    return numero

Na linha 3, nós colocamos o primeiro resto da divisão de n por 2 na nossa lista de restos, assim como vimos no post anterior (falei que era para você ler!). Na linha 4, dividimos n por 2, já que a próxima divisão é a do resultado por 2, e guardamos em n mesmo.

O while da linha 5 vai repetir isso: colocar o resto da divisão de n por 2 na lista e dividir n por 2 e guardar em n novamente, o que fazemos nas linhas 6 e 7, respectivamente. Nós paramos quando n for 0.

As linhas 10 a 12 só invertem a lista e fazem ela se transformar no número em binário mesmo, mas não são importantes nesse momento: basta saber que precisamos inverter a lista, já que os restos aparecem na ordem contrária.

Vamos ver alguns exemplos:

print(decimal_para_binario(42))
# Imprime 101010
print(decimal_para_binario(2))
# Imprime 10
print(decimal_para_binario(32))
# Imprime 100000
print(decimal_para_binario(63))
# Imprime 111111

Assim terminamos nossa aventura pelo binário. Parabéns!

São Paulo / SP

14 avaliações
Mestrado: MSc Advanced Computing - Machine Learning, Data Mining and H (University of Bristol - UK)
Professor de matemática e computação na Escola Britânica de São Paulo, St. Paul's. Experiência no preparo para IB (Studies, SL e HL), IGCSE, SAT e ACT.
IGCSE Computer Sciece, IB Computer Science, Python, C, C++, Matemática para Ensino Fundamental, Matemática para Ensino Médio
Oferece aulas online (sala profes)
Oferece aulas presenciais
R$ 224 / aula
Conversar
Cadastre-se ou faça o login para comentar nessa publicação.

Confira artigos similares

Confira mais artigos sobre educação

Ver todos os artigos

Encontre um professor particular

Busque, encontre e converse gratuitamente com professores particulares de todo o Brasil