Conversões Numéricas
Implementações em C++ para conversão entre diferentes formatos numéricos, icnluindo decimal, hexadecimal e BCD, com uso de funções bem definidas e saída formatada via printf.
Função: Inversão de Bytes
Realiza o complemento de um byte em dados binários:
int inverterBytes(unsigned char *saida, const unsigned char *entrada, int tamanho) {
for (int i = 0; i < tamanho; ++i) {
saida[i] = entrada[i] ^ 0xFF;
}
return 0;
}
Hexadecimal para Decimal
Converte uma sequência de bytes em formato hexadecimal para um valor decimal:
unsigned long hexParaDecimal(const unsigned char *hex, int length) {
unsigned long resultado = 0;
for (int i = 0; i < length; ++i) {
resultado += (unsigned long)(hex[i]) << (8 * (length - 1 - i));
}
return resultado;
}
Decimal para Hexadecimal
int decimalParaHex(int valor, unsigned char *saida, int tamanho) {
for (int i = tamanho - 1; i >= 0; --i) {
saida[i] = (valor % 256) & 0xFF;
valor /= 256;
}
return 0;
}
Potência de Base
Calcula a potência de um número com base e expoente inteiros:
unsigned long potencia(int base, int expoente) {
unsigned long resultado = 1;
for (int i = 0; i < expoente; ++i) {
resultado *= base;
}
return resultado;
}
BCD para Decimal
Convetre um número codificado em BCD para seu valor decimal equivalente:
unsigned long bcdParaDecimal(const unsigned char *bcd, int tamanho) {
unsigned long valor = 0;
for (int i = 0; i < tamanho; ++i) {
int dezena = (bcd[i] >> 4) & 0x0F;
int unidade = bcd[i] & 0x0F;
valor += (dezena * 10 + unidade) * potencia(100, tamanho - 1 - i);
}
return valor;
}
Decimal para BCD
int decimalParaBcd(int valor, unsigned char *bcd, int tamanho) {
for (int i = tamanho - 1; i >= 0; --i) {
int temp = valor % 100;
int dezena = temp / 10;
int unidade = temp % 10;
bcd[i] = (dezena << 4) | unidade;
valor /= 100;
}
return 0;
}
Exemplo de Uso no main()
#include <iostream>
using namespace std;
int main() {
unsigned char bcd[3] = {0x00, 0x53, 0x20};
unsigned long valorDecimalBcd = bcdParaDecimal(bcd, 3);
cout << "Decimal (BCD): " << valorDecimalBcd << endl;
unsigned char saidaBcd[3];
decimalParaBcd(valorDecimalBcd, saidaBcd, 3);
for (int i = 0; i < 3; ++i) {
printf("BCD[%d] = 0x%02X\n", i, saidaBcd[i]);
}
unsigned char hex[3] = {0x00, 0x53, 0x20};
unsigned long valorDecimalHex = hexParaDecimal(hex, 3);
cout << "Decimal (HEX): " << valorDecimalHex << endl;
unsigned char saidaHex[3];
decimalParaHex(valorDecimalHex, saidaHex, 3);
for (int i = 0; i < 3; ++i) {
printf("HEX[%d] = 0x%02X\n", i, saidaHex[i]);
}
return 0;
}
Impresão Formatada com printf
Exemplos de formatação de saída para diferentes bases numéricas:
int valor = 9;
// Saída decimal
printf("%d\\n", valor); // 9
printf("%4d\\n", valor); // 9
printf("%04d\\n", valor); // 0009
// Saída hexadecimal
printf("%x\\n", valor); // 9
printf("%4x\\n", valor); // 9
printf("%04x\\n", valor); // 0009
// Saída octal
printf("%o\\n", valor); // 11
printf("%4o\\n", valor); // 11
printf("%04o\\n", valor); // 0011
Funções em C++
Funções são blocos de código reutilizáveis que realizam tarefas específicas. Um programa C++ sempre começa com a função main().
Declaração e Definição
Exemplo de função que retorna o maior entre dois números:
int maximo(int a, int b) {
return (a > b) ? a : b;
}
Chamada de Função
int resultado = maximo(100, 200);
cout << "Máximo: " << resultado << endl;
Parâmetros Padrão
int soma(int a, int b = 20) {
return a + b;
}
int valor1 = soma(100); // retorna 120
int valor2 = soma(100, 50); // retorna 150
Lambdas
Expressões lambda permitem criar funções anônimas inline:
auto comparar = [](int x, int y) { return x < y; };
int total = [](int a, int b) -> int { return a + b; }(10, 20);