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 d=bindec(b), 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:
c) 111001100011

Passo 1

O enunciado pede para a gente criar uma função chamada bindec(b) que receba um vetor b de zeros e uns (até 20 dígitos) e retorne seu valor decimal. Se o vetor tiver mais de 20 elementos, a função deve emitir um erro. Em seguida, usamos essa função para converter o binário 111001100011 em decimal.

Passo 2

Para resolver, vamos determinar o algoritmo de conversão binário todecimal. Se b = [b1,b2,dots,bn] (cada biin0,1) então o valor decimal é
d ;=;sumk=1^n bk,2^,n-k
Além disso, antes de calcular, checamos se n>20: nesse caso damos erro. Também validamos que cada elemento de b seja 0 ou 1.

Passo 3

Aqui está a implementação em Python:
def bindec(b):
    """
    Converte vetor b de \(0\)s e \(1\)s em inteiro decimal.
    Erro se len(b) > \(20\) ou se b contiver outro valor que não \(0\)/\(1\).
    """
    n \(=\) len(b)
    if n > \(20\):
        raise ValueError("Erro: vetor binário muito longo (máx. \(20\) dígitos).")
    d \(=0\)
    for bit in b:
        if bit not in (\(0,1\)):
            raise ValueError("Erro: vetor deve conter apenas \(0\)s e \(1\)s.")
        d \(=\) d*\(2+\) bit
    return d
Explicando o código:
  • Primeiro checamos len(b)>\(20\).
  • Depois inicializamos d \(=0\) e, para cada bit em b, atualizamos d \(=\) d*\(2+\) bit, o que equivale ao somatório acima.
  • Se encontrar algo diferente de ou , levanta erro.

Passo 4

Agora aplicamos a função ao vetor correspondente a “ ”. Em Python, podemos escrever:
b \(=\) list(map(int, list("\(111001100011\)")))
d \(=\) bindec(b)
print(d)
Nesse caso b \(=\) [\(1,1\),\(1,0\),\(0,1\),\(1,0\),\(0,0\),\(1,1\)], tem e todos os elementos válidos. O cálculo é

Resposta

O número 111001100011 em decimal é 3683.

Exercícios relacionados