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++, Programação em C, Matemática para Ensino Fundamental, Matemática para Ensino Médio
Oferece aulas online (sala profes)
Oferece aulas presenciais
R$ 200 / aula
Conversar
Cadastre-se ou faça o login para comentar nessa publicação.

Listas de exercícios, Documentos, Revisões de textos, Trabalhos?

Se seu problema for dificuldade em uma lista de exercícios, revisão de teses e dissertações, correção de textos ou outros trabalhos, peça uma ajuda pelo Tarefas Profes.

Enviar Tarefa

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