Hoje eu vou mostrar aqui um código bem simples e bem curto que eu escrevi e que serve para converter números do sistema decimal para binários em Python. Na verdade, o Python já conta com uma função bin() capaz de converter um número decimal para uma string com seu correspondente binário. Mas achei interessante postar o código aqui porque ele utiliza alguns recursos interessantes do Python, e é um exemplo de como podemos transportar algoritmos que usamos na vida real para o Python. Em outras palavras, pensar como o Python pensa.
(Nota: pra facilitar a sua vida, você pode baixar o código desse e dos outros tutoriais do blog direto do repositório do blog no Github).
Neste post não vou entrar em muitos detalhes sobre a natureza dos números binários, apenas explicarei como fazer um código em Python que converte um número natural do sistema decimal para seu equivalente no sistema binário. Mas eu escrevi um post chamado Bits, bytes e tipos de dados, em que falo sobre o assunto com mais profundidade (e ainda pretendo postar mais textos no futuro falando sobre o assunto).
Como funciona a conversão entre os sistemas decimal e binário
Converter um número do sistema numérico decimal para o sistema binário significa basicamente representá-lo com zeros e uns. Podemos enxergar cada “casa” de um número binário como um bit (“binary digit”). Uma cadeia de bits (um bit do lado do outro) com uma quantidade suficientemente grande de bits pode armazenar qualquer número.
O “algoritmo” que nós, seres humanos utilizamos para converter um número do sistema decimal para o sistema binário é muito simples:
“Primeiro, dividimos um número qualquer por 2, e anotamos o resto da divisão, que sempre vai ser 1 ou 0. Se o resultado da divisão for maior que 1, repetimos o processo, dividindo esse número por 2 outra vez e anotando outra vez o resto da divisão pelo novo número, e repetimos isso até o resultado da divisão dar 1, Quando finalmente o resto da divisão der 1, anotamos o número 1 junto aos restos da divisão e encerramos o processo”. O número binário será esse número que anotamos, só que ao contrário, por exemplo:

Agora, lendo debaixo pra cima, o número binário correspondente a 300 será 100101100. Acredite em mim, é isso mesmo! Agora, perceba que o resto da divisão de 1 por 2 não deixa de ser 1, e o resultado da divisão de 1 por 2 (0.5) arredondado para o menor número não deixa de ser 0. Pelo menos o Python entende assim, e é isso que importa para o nosso código. Então podemos simplificar ainda mais nosso algoritmo:
“Enquanto o resultado da divisão do número for maior que zero, divida o número, anote o resto e repita o processo com o novo número. Depois inverta os números anotados.”
O conversor de decimal para binário
Agora vamos para o nosso código. Traduzindo do português para o pythonico, temos o seguinte:
1 def decimal_para_binario(decimal): 2 binario = '' 3 while decimal > 0: 4 binario+= str(decimal%2) 5 decimal//= 2 6 return binario[::-1]
Primeiro, definimos a função que fará esse trabalho de conversão pra a gente. Ela receberá apenas um parâmetro, que será o número natural que converteremos pra binário.
Precisamos também de uma variável para armazenar os restos de divisão. Para isso, declaramos a variável binario. Nossa variável poderia ser também uma lista, entretanto, acredito que utilizar strings seja mais simples nesse caso, porque podemos manipulá-la utilizando o operador aritmético de soma (+) para acrescentar os símbolos a ela.
Agora, indo para o nosso algoritmo propriamente dito, a linha 3 não tem muito segredo. Ela é uma tradução praticamente literal do nosso algoritmo. Já a linha 4 pode não parecer tão clara assim num primeiro momento. Então vamos por partes. Em Python, a forma a+=b corresponde a a = a + b. Então a expressão da linha 3 corresponde à binario = binario+str(decimal%2).
A função str() serve para converter um valor de um tipo qualquer (se possível), em uma string. Nesse caso, ela converte o resultado da operação decimal%2. Em Python, o símbolo % é o operador de módulo, que retorna o resto de uma divisão (já falei sobre ele aqui!. Então o que essa linha de código faz é pegar o resto da divisão, que será 0 ou 1, transformar esse número num caractere ‘0’ ou ‘1’ e acrescentar esse caractere à variável binario.
A linha 5, como a linha 4, pode ser desdobrada em decimal = decimal//2. O símbolo // corresponde ao operador de floor division, que, basicamente, divide um número e arredonda ele pra baixo.
Então, com essas linhas, nosso programa pega o resto da divisão, joga pra a string binario, divide o número por dois de novo, arredondando pra baixo (o que, com números positivos, equivale a fazer a divisão inteira) e repete o processo até nosso número ser zero. Agora só precisamos inverter a ordem da string!
Em nosso código, fazemos isso com a operação binario[::-1]. Está fora do escopo deste tutorial explicar detalhadamente como funcionam as operações com colchetes em strings. Mas, resumindo, quando escrevemos string[2:5:1] estamos cortando a string em questão e pegando seu “pedaço” que vai do índice 2 até (mas não incluindo) o índice 5. Isso é o que fazem os dois primeiros números dentro dos colchetes. O último indica o “passo” ou os “saltos” que você quer que a operação com os colchetes dê.
No exemplo acima, o “passo” é igual a 1, ou seja, a operação irá percorrer os caracteres de um em um, o que é o padrão. Se tivessemos uma variável minha_string = “Toda vez que o seu namorado sai, você vai ver outro rapaz” e fizessemos a operação minha_string[::2], o resultado seria ‘Td e u e aoaosi oêvivrotorpz’. Ou seja, a operação percorreu a string “pegando” os caracteres de dois em dois. Perceba que nesse caso, omitimos os dois primeiros números, o que significa que nossa “fatia” será a string inteira.
No nosso código, também omitimos os dois primeiros números, o que significa que pegaremos a string inteira. Mas utilizamos o índice -1, como terceiro elemento da operação com os colchetes. Isso faz com que o Python percorra a string de trás pra frente, de um em um caractere. O que é exatamente o que precisamos para inverter a string.
Essa string invertida é o número binário que desejamos, e então retornamos ela como resultado da função para o programa principal. Acrescentando nosso bom e velho if __name__ == ‘__main__’ (clique aqui se você não souber pra que serve isso!), temos o seguinte:
def decimal_para_binario(decimal): binario = '' while decimal > 0: binario+= str(decimal%2) decimal//= 2 return binario[::-1] if __name__ == '__main__': num = int(input("Digite um número:")) print("O número em binário é: "+decimal_para_binario(num))
Pronto! Assim, podemos tanto rodar o programa diretamente, como também importá-lo em outro código.
Pra onde ir daqui?
Este código é bastante simples e existe uma série de melhorias que você poderia fazer nele.
Por exemplo, o que acontece se o usuário digitar “Dona Maria, deixa eu namorar a sua filha?” ao invés de digitar um número inteiro? Você poderia implementar uma forma de evitar que o usuário digite algo diferente de um número inteiro positivo.
Outra sugestão, quando representamos números binários, costumamos dividí-los em blocos de 4 bits pra facilitar a leitura. Assim, os bits correspondentes ao número 300 poderiam ser representados como 0001 0010 1100.
Você poderia modificar o código para completar os zeros à esquerda quando não houvesse quatro digitos no último agrupamento (mais à esquerda), e para separar os blocos de quatro digitos com espaços (veja nesse link um código mais aprimorado no qual eu fiz isso!).
Você poderia também possibilitar a conversão de binário para decimal.
Enfim, use a criatividade! E rolando qualquer dúvida, deixe seu comentário!
Muito bom. Onde você adquiriu seus conhecimentos? Quais cursos? Conta um pouco da tua jornada de aprendizado aí pra galera.
Opa! Tudo bem, alexandre? Então… eu comecei a programar em BASIC com uns 12 anos de idade (eu queria desenvolver um sistema operacional chamado ANDRIX e criar o Digimundo, mas não consegui nenhum dos dois). Depois parti pro C, porque me disseram que era a melhor linguagem pra programar jogos (na época). E depois acabei começando a estudar Python por conta de algumas recomendações de amigos. Durante muitos anos, eu programei só por hobby mesmo, estudando tópicos de computação que me interessavam só nas horas vagas. 17 anos depois, eu entrei pra Bacharelado em Sistemas de Informação na UFBA e recentemente me transferi pra Engenharia de Computação na UEFS. 😛 Sempre gostei mais de ler livros do que fazer cursos e tal. Mas sempre estudei de um jeito meio aleatório, pulando de coisa em coisa e largando pra lá assim que ficava difícil demais pra eu acompanhar (pra então voltar no assunto meses depois). Então boa parte do meu conhecimento foi adquirido de forma bastante assistemática, variando de acordo com meus interesses momentâneos, meus conhecimentos e a disponibilidade de materiais didáticos. A faculdade que acabou me ajudando bastante a aprender a estudar (“estudar errado” existe) e a pesquisar (e também me obrigando a estudar coisas que eu não estudaria por livre e espontânea vontade, mas que são importantes!).