Escreva uma função em Scilab, Octave ou Python definida pelo usuário que converta inteiros escritos na forma binária para a forma decimal. Nomeie a função
, onde o argumento de entrada b é um vetor com 1’s e 0’s que representa o número binário a ser convertido, e o argumento de saída d é um número na forma decimal. 0 maior número que pode ser convertido com a função deverá ser um número binário com no máximo 20 1’s. Se um número maior for inserido para b, a função deverá exibir uma mensagem de erro. Use a função para converter os seguintes números:
a) 11010
a) 11010
Passo 1
O enunciado pede que a gente escreva uma função de usuário chamada 's e
's e retorne o valor decimal correspondente. Há ainda uma restrição: não pode haver mais de
dígitos
bindec
(em Python, Octave ou Scilab) que receba um vetor b
de
\(1\)
em b
; se houver, exibimos mensagem de erro. Depois, usamos essa função para converter o binário \(11010\)
.Passo 2
Definimos a função e fazemos validações:
. Checamos se
. Verificamos que cada elemento é
ou
.
. Calculamos
b
é uma lista (ou tupla) de inteiros.\(num_uns =\) sum(b)
e, se \(num_uns\) > \(20\)
, lançamos um erro.Passo 3
Implementamos o algoritmo de conversão binário
decimal. A forma mais direta é percorrer os bits de MSB a LSB e ir acumulando:
def bindec(b):
# Validação de tipo e conteúdo
if not isinstance(b, (list, tuple)):
raise TypeError("b deve ser uma lista ou tupla de \(0\)'s e \(1\)'s")
if any(bit not in (\(0,1\)) for bit in b):
raise ValueError("b só pode conter \(0\) e \(1\)")
# Restrição de no máximo \(20\) dígitos '\(1\)'
if sum(b) > \(20\):
raise ValueError("Erro: mais de \(20\) dígitos '\(1\)' não são permitidos")
# Conversão
decimal \(=0\)
for bit in b:
decimal \(=\) decimal*\(2+\) bit
return decimal
Passo 4
Usamos a função para converter
\(11010\)
. Primeiro montamos o vetor de bits:b \(=\) [\(1\), \(1\), \(0\), \(1\), \(0\)]
d \(=\) bindec(b)
print(d) # isso exibirá o valor decimal
No cálculo manual, equivale a