Há muito tempo já tinha reparado que não existia uma função pronta que converte da base decimal para binária.
Eu estava enganado e um professor falou da função itoa. No entanto, para minha decepção, a função não funciona apresentando o erro abaixo:
teste.c:(.text+0x4f): undefined reference to `itoa'
Como disse um velho amigo de programação: "você não precisa saber todos os comandos, funções e etecera. Se for criativo, você contorna a situação". Então criei minha própria forma de converter de decimal para binário. Basta executar o programa na linha de comando passando como parâmetro o número na base decimal. O código em C++ contém comentários descrevendo suas etapas.
Bibliotecas necessárias:
- iostream
- iomanip
- cstdlib
Para converter de decimal para binário, a primeira tarefa é determinar a quantidade de divisões. Para tal, foi preciso que primeiro cálculo fosse feito fora do while para determinar o valor do quociente. Só então o loop while começa incrementando a variável divisoes.
A cada divisão, o valor do resto é armazenado em um vetor. Assim, cada cálculo, um índice é preenchido.
Para exibir o resultado, é impresso o quociente encontrado na última divisão e o vetor de restos do maior para o menor índice.
Para o valor hexadecimal, a namespace hex converte para hexadecimal. Finalmente, para o valor octal, a namespace oct converte para octal.
Apresento o código-fonte abaixo.
// Created by Murilo Fujita <murilofujita@gmail.com> in 09/21/2012 #include <iostream> using std::cin; using std::cout; using std::endl; #include <iomanip> using std::setprecision; using std::setw; #include <cstdlib> using std::hex; using std::oct; int main(int argc, char** argv) { int pos=50; //quantidade de POSICOES do array int num,quo,res[pos], divisoes, numero; if (argc <2) { cout << "Digite um número na base decimal" << endl; exit(1); } num=atoi(argv[1]); numero=num; // num é usado para calculos; numero é usado para recuperar o input divisoes=0; // inicializa a quantidade de divisoes quo=num/2; res[0]=num%2; // precisa calcular o primeiro resto para o WHILE saber como comeca pos=1; // comeca em 1 porque o indice 0 ja foi calculado fora do loop while (quo>1) { quo=num/2; // quociente res[pos++]=num%2; // armezena os restos num=quo; // sacada para realizar as divisoes sucessivas divisoes++; //conta a quantidade de divisoes } cout << numero << " precisa de " << divisoes+1 << " bits." << endl; pos=divisoes; cout << "binário: "; cout << quo; // imprime o bit mais significativo: o quociente da ultima divisao for (int j=divisoes; j>0; j--) { cout << res[pos--]; // imprime os restos do ultimo indice para o primeiro } cout << endl; cout << "hexadecimal: " << hex << numero << endl; cout << "octal: " << oct << numero << endl; return 0; }
E para concluir, dois exemplos da resposta do programa:
./bases_numericas.out 51966 51966 precisa de 16 bits. binário: 1100101011111110 hexadecimal: cafe octal: 145376
./bases_numericas.out 987654321 987654321 precisa de 30 bits. binário: 111010110111100110100010110001 hexadecimal: 3ade68b1 octal: 7267464261