🧪 Laboratório 4 - Operações Bit-a-Bit e Máscaras
📝 Descrição - Peso 1
O objetivo desta atividade é a familiarização com operações de deslocamento de bits e máscaras
Exercício
Escreva um programa em C que leia 8 números da entrada do usuário no formato decimal, faça algumas operações bit a bit e compacte seus bits em um único valor de 32 bits, que será escrito na saída padrão como um valor hexadecimal. O programa deve lidar com números positivos e negativos.
Uma função com a assinatura void pack(int input, int start_bit, int end_bit, int *val) pode ser um bom ponto de partida para este exercício.
As funções previamente apresentadas read e write podem ser usadas para ler/escrever informações da/para a entrada/saída padrão. O trecho de código abaixo pode ser usado para escrever o valor hexadecimal resultante no STDOUT (observe que ele usa a função write).
void hex_code(int val){
char hex[11];
unsigned int uval = (unsigned int) val, aux;
hex[0] = '0';
hex[1] = 'x';
hex[10] = '\n';
for (int i = 9; i > 1; i--){
aux = uval % 16;
if (aux >= 10)
hex[i] = aux - 10 + 'A';
else
hex[i] = aux + '0';
uval = uval / 16;
}
write(1, hex, 11);
}
Input
- 8 números decimais assinados de 4 dígitos separados por espaços (' '), seguidos por um caractere de nova linha ('\n'). Toda a entrada ocupa 48 bytes.
- Formato de string - "SDDDD SDDDD SDDDD SDDDD SDDDD SDDDD SDDDD SDDDD\n"
- S: sinal, pode ser '+' para números positivos e '-' para negativos.
- D: um dígito decimal, (0-9)
- Formato de string - "SDDDD SDDDD SDDDD SDDDD SDDDD SDDDD SDDDD SDDDD\n"
Output
-
Depois de ler todos os 8 números, você deve fazer operações bit a bit, seguindo a seguinte ordem:
- 1º número and 2º numero ==> N1
- 3º número or 4º numero ==> N2
- 5º número xor 6º numero ==> N3
- 7º número nand 8º numero ==> N4
-
Em seguida, você deve agrupar os quatros números resultantes das operações (N1, N2, N3 e N4), da seguinte maneira, sabendo que LSB são os bits menos significativos e MSB são os bits mais significativos:
- N1: 8 LSB => Bits 0 - 7
- N2: 8 LSB => Bits 8 - 15
- N3: 8 MSB => Bits 24 - 31
- N4: 8 MSB => Bits 16 - 23
📥 Exemplos
Input | Output |
---|---|
-0001 -0001 -0001 -0001 -0001 -0001 -0001 +0000 | 0x00FFFFFF |
+0001 +0001 -0001 -0001 +0001 +0001 -0001 -0001 | 0x0000FF01 |
+0003 -0002 +0025 +0030 +0003 -0002 +0025 +0030 | 0xFFFF1F02 |
+9999 +9999 +9999 +9999 +9999 +9999 +9999 +9999 | 0x00FF0F0F |
💡 Dicas
- Você pode usar o operador C para manipulação de bits (<<, >>, |, &, ^, ...) para implementar sua função
- Notas de aula do curso "Effective Programming Effective Programming Effective Programming in C & Unix" na Carnegie Mellon University
- Slides do curso "Computer Organization & Systems" (CS107) na Stanford University
Entrega
- Submeta o arquivo renomeado lab4_ra.report no Classroom com o relatório de execução gerado pelo assistente no simulador pelo link
Warning
- Qualquer alteração no arquivo de report será considerado fraude
- Está é uma atividade individual, o qual deve ser desenvolvido individualmente, qualquer forma de cópia ou plágio será penalizada. Portanto, atividades que apresentarem semelhanças injustificadas serão atribuídas nota zero para todos os envolvidos