Conversão de Bases em Linguagem C

Hoje vou mostrar como converter bases utilizando Linguagem C (como por exemplo, binário para decimal, decimal para octal, etc).

As conversões foram criadas conforme exemplos e documentações na internet. Porém nem todas estão criadas, mas todas as conversões para decimal sim, então, se precisar criar alguma, basta converter para decimal e depois converter para o que é desejado (por exemplo, de hexa para decimal).

Abaixo um print da rotina sendo executada via Prompt de Comando (Windows).

Conversão Bases

Abaixo o código fonte desenvolvido para ser estudado, no começo estão os links usados como referência.

/*
 * Links de apoio:
 * 
 * https://www.programiz.com/c-programming/examples/binary-decimal-convert
 * https://codeforwin.org/2015/09/c-program-to-convert-hexadecimal-to-decimal-number-system.html
 * https://www.programiz.com/c-programming/examples/octal-decimal-convert
 * 
 */

#include <stdio.h>
#include <math.h>
#include <string.h>

//Chamadas das funções
int converterBin2Dec(long long valor_binario);
long long converterDec2Bin(int valor_decimal);
int converterDec2Oct(int valor_decimal);
long long converterOct2Dec(int valor_octal);

int main()
{
	
	//Variáveis usadas
	char opc = ' ';
	int valor_octal;
	long long valor_binario;
	int valor_decimal, cociente;
	int sequencial, valor_temp, tamanho_string;
	char valor_hexa[100];
	
	//Enquanto não for a opção 0 (Sair)
	while (opc != '0') {
		
		//Mostra o menu principal
		printf("\n----------------------\n");
		printf("Digite a Opcao\n");
		printf("1 - Binario para Decimal\n");
		printf("2 - Binario para Octal\n");
		printf("3 - Decimal para Binario\n");
		printf("4 - Decimal para Octal\n");
		printf("5 - Decimal para Hexa\n");
		printf("6 - Octal para Decimal\n");
		printf("7 - Hexa para Decimal\n");
		printf("0 - Sair\n");
		printf("Resposta: ");
		scanf("%c", &opc);
		getchar();
		
		//Opção 1 - Binário -> Decimal
		if (opc == '1') {
			printf("Digite numero binario: ");
			scanf("%lld", &valor_binario);
			printf("[%lld] em binario = [%d] em decimal\n", valor_binario, converterBin2Dec(valor_binario));
		}
		
		//Opção 2 - Binário -> Octal
		else if (opc == '2') {
			printf("Digite numero binario: ");
			scanf("%lld", &valor_binario);
			valor_decimal = converterBin2Dec(valor_binario);
			valor_octal   = converterDec2Oct(valor_decimal);
			printf("[%lld] em binario = [%d] em octal\n", valor_binario, valor_octal);
		}
		
		//Opção 3 - Decimal -> Binário
		else if (opc == '3') {
			printf("Digite o numero decimal: ");
			scanf("%d", &valor_decimal);
			printf("[%d] em decimal = [%lld] em binario\n", valor_decimal, converterDec2Bin(valor_decimal));
		}
		
		//Opção 4 - Decimal -> Octal
		else if (opc == '4') {
			printf("Digite o numero decimal: ");
			scanf("%d", &valor_decimal);
			printf("[%d] em decimal = [%d] em octal\n", valor_decimal, converterDec2Oct(valor_decimal));
		}
		
		//Opção 5 - Decimal -> Hexadecimal
		else if (opc == '5') {
			printf("Digite o numero decimal: ");
			scanf("%d", &valor_decimal);
			
			//Zerando variáveis
			sequencial = 0;
			cociente = valor_decimal;
			
			//Enquanto tiver cociente
			while (cociente != 0) {
				//Pega o resto da divisão por 16
				valor_temp = cociente % 16;
				
				//Se for menor que 10, soma com 48 (tabela ascii - parte de números)
				if( valor_temp < 10)
					valor_temp = valor_temp + 48;
					
				//Senão, soma com 55 (tabela ascii - parte de letras)
				else
					valor_temp = valor_temp + 55;
				
				//Joga o caracter na sequência da string
				valor_hexa[sequencial++] = valor_temp;
				
				//Divide o resto por 16
				cociente = cociente / 16;
			}
			//Encerra a string e mostra a mensagem
			valor_hexa[sequencial++] = '\0';
			printf("[%d] em decimal = [%s] em hexa", valor_decimal, valor_hexa);
		}
		
		//Opção 6 - Octal -> Decimal
		else if (opc == '6') {
			printf("Digite o numero octal: ");
			scanf("%d", &valor_octal);
			printf("[%d] em octal = [%lld] em decimal\n", valor_octal, converterOct2Dec(valor_octal));
		}
		
		//Opção 7 - Hexa -> Decimal
		else if (opc == '7') {
			//Zera a variável de valor Decimal
			valor_decimal = 0;
			
			//Mostra mensagem para inserir valor hexa
			printf("Insira o valor hexa: ");
			gets(valor_hexa);

			//Pega o tamanho da string
			tamanho_string = strlen(valor_hexa);
			tamanho_string--;
			
			//Percorre todas as posições da string
			for(sequencial=0; valor_hexa[sequencial]!='\0'; sequencial++)
			{
				//Se for maior ou igual a 0 e menor ou igual a 9, será o valor retirando 48 (tabela ascii)
				if(valor_hexa[sequencial]>='0' && valor_hexa[sequencial]<='9')
				{
					valor_temp = valor_hexa[sequencial] - 48;
				}
				
				//Se for maior ou igual a a e menor ou igual a f, será o valor retirando 97 (tabela ascii) + 10 (0 a 9)
				else if(valor_hexa[sequencial]>='a' && valor_hexa[sequencial]<='f')
				{
					valor_temp = valor_hexa[sequencial] - 97 + 10;
				}
				
				//Se for maior ou igual a A e menor ou igual a F, será o valor retirando 65 (tabela ascii) + 10 (0 a 9)
				else if(valor_hexa[sequencial]>='A' && valor_hexa[sequencial]<='F')
				{
					valor_temp = valor_hexa[sequencial] - 65 + 10;
				}
				
				//Incrementa o valor decimal multiplicando o valor por 16 elevado à potência
				valor_decimal += valor_temp * pow(16, tamanho_string);
				tamanho_string--;
			}
			printf("[%s] em hexa = [%d] em decimal", valor_hexa, valor_decimal);
		}
		
		//Opção desconhecida
		else {
			printf("Opcao desconhecida [%c]\n", opc);
		}
	}
	
	return 0;
}

//Função para converter Binário para Decimal
int converterBin2Dec(long long valor_binario)
{
    int valor_decimal = 0, sequencial = 0, resto;
    
    //Enquanto existir valor no binário
    while (valor_binario != 0)
    {
		//Pega o resto da divisão do valor binário por 10
        resto = valor_binario % 10;
        
        //Divide o valor binário por 10
        valor_binario /= 10;
        
        //Incrementa o valor decimal com o resto da divisão multiplicado por 2 elevado ao sequencial
        valor_decimal += resto * pow(2, sequencial);
        
        //Incrementa a sequencial
        ++sequencial;
    }
    
    return valor_decimal;
}

//Função para converter Decimal para Binário
long long converterDec2Bin(int valor_decimal)
{
    long long valor_binario = 0;
    int resto, sequencial = 1;

	//Enquanto o valor decimal for diferente de zero
    while (valor_decimal != 0)
    {
		//Pega o resto da divisão
        resto = valor_decimal % 2;
        
        //Divide o valor decimal por 2
        valor_decimal /= 2;
        
        //Incrementa o valor binário, multiplicando o resto da divisão pelo sequencial
        valor_binario += resto * sequencial;
        
        //Multiplica o sequencial por 10
        sequencial *= 10;
    }
    
    return valor_binario;
}

//Função para converter Decimal para Octal
int converterDec2Oct(int valor_decimal)
{
    int valor_octal = 0, sequencia = 1;
	
	//Enquanto o valor decimal for diferente de zero
    while (valor_decimal != 0)
    {
		//Incrementa o valor octal com o resto da divisão do decimal por 8 multiplicado pelo sequencial
        valor_octal += (valor_decimal % 8) * sequencia;
        
        //O valor decimal será dividido por 8
        valor_decimal /= 8;
        
        //O sequencial sera multiplicado por 10
        sequencia *= 10;
    }

    return valor_octal;
}

//Função para converter Octal para Decimal
long long converterOct2Dec(int valor_octal)
{
    int valor_decimal = 0, sequencia = 0;

	//Enquanto o valor octal for diferente de zero
    while(valor_octal != 0)
    {
		//Incrementa o valor decimal com o resto da divisão do valor octal por 10 multiplicado por 8 elevado pelo sequencial
        valor_decimal += (valor_octal % 10) * pow(8, sequencia);
        
        //Incrementa o sequencial
        ++sequencia;
        
        //Divide o valor octal por 10
        valor_octal /= 10;
    }

    return valor_decimal;
}

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação