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).
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.