🧩 Exercícios: Programação de Baixo Nível, Bitwise e Alinhamento
Spec Sistemas Com Cpp • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 18.1 — Operações Bitwise (&, |, ^, ~, «, ») e Máscaras de Bits
| Contexto: Operações Bitwise (&, | , ^, ~, «, ») e Máscaras de Bits no contexto de Programação de Baixo Nível, Bitwise e Alinhamento. |
Requisitos de Execução:
- Ativar, desativar e verificar bits específicos de um registrador de 8 bits.
Resultado Esperado
Máscaras binárias manipuladas com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_1_SeuNome - Envie na tarefa:
Atividade Cap 18 - Programação de Baixo Nível, Bitwise e Alinhamento
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <cstdint>
int main() {
uint8_t flags = 0b00000000;
flags |= (1 << 2); // Ativa bit 2
flags |= (1 << 5); // Ativa bit 5
std::cout << "Flag 2 ativa: " << ((flags & (1 << 2)) ? "SIM" : "NAO") << std::endl;
std::cout << "Valor final: 0x" << std::hex << (int)flags << std::endl;
return 0;
}
🔍 Nível 2: Prática
Problema 18.2 — Operações com a Biblioteca do C++20 (std::popcount, std::has_single_bit)
Contexto: Operações com a Biblioteca
Requisitos de Execução:
- Contar bits ativos com
std::popcounte testar potência de 2 comstd::has_single_bit.
Resultado Esperado
Funções intrínsecas de CPU (POPCNT) executadas via `<bit>`.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_2_SeuNome - Envie na tarefa:
Atividade Cap 18 - Programação de Baixo Nível, Bitwise e Alinhamento
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <bit>
int main() {
unsigned int val = 0b10110010;
std::cout << "Bits ativos (popcount): " << std::popcount(val) << std::endl;
std::cout << "Eh potencia de 2: " << (std::has_single_bit(16u) ? "SIM" : "NAO") << std::endl;
return 0;
}
⚡ Nível 3: Integração
Problema 18.3 — Conversão Segura de Tipos sem Violação de Strict Aliasing com std::bit_cast
Contexto: Conversão Segura de Tipos sem Violação de Strict Aliasing com std::bit_cast no contexto de Programação de Baixo Nível, Bitwise e Alinhamento.
Requisitos de Execução:
- Converter representação binária de float para uint32_t com
std::bit_cast<uint32_t>(f).
Resultado Esperado
Conversão em tempo de compilação sem UB (Undefined Behavior).
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_3_SeuNome - Envie na tarefa:
Atividade Cap 18 - Programação de Baixo Nível, Bitwise e Alinhamento
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <bit>
#include <cstdint>
int main() {
float f{1.0f};
auto bits = std::bit_cast<uint32_t>(f);
std::cout << "std::bit_cast float 1.0f: 0x" << std::hex << bits << std::endl;
return 0;
}
🏆 Nível 4: Desafio Corporativo
Problema 18.4 — Alinhamento de Memória Controlado com alignas e alignof
Contexto: Alinhamento de Memória Controlado com alignas e alignof no contexto de Programação de Baixo Nível, Bitwise e Alinhamento.
Requisitos de Execução:
- Alinhar buffer estrito para limites de 64 bytes para instruções vetoriais SIMD (AVX-512).
Resultado Esperado
Estrutura alinhada em 64 bytes para processamento vetorial sem cache splits.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_4_SeuNome - Envie na tarefa:
Atividade Cap 18 - Programação de Baixo Nível, Bitwise e Alinhamento
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
struct alignas(64) BlocoSIMD {
float dados[16];
};
int main() {
std::cout << "Alinhamento da struct: " << alignof(BlocoSIMD) << " bytes\n";
std::cout << "Tamanho: " << sizeof(BlocoSIMD) << " bytes\n";
return 0;
}