Laboratório 5
Objetivo
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 5 números da entrada do usuário no formato decimal 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
- 5 números decimais assinados de 4 dígitos separados por espaços (' '), seguidos por um caractere de nova linha ('\n'). Toda a entrada ocupa 30 bytes.
- Formato de string - "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\n"
Output
- Depois de ler todos os 5 números, você deve agrupar seus bits menos significativos (LSB) seguindo as regras listadas abaixo:
- 1º número: 5 LSB => Bits 0 - 4
- 2º número: 7 LSB => Bits 5 - 11
- 3º número: 9 LSB => Bits 12 - 20
- 4º número: 4 LSB => Bits 21 - 24
- 5º número: 7 LSB => Bits 25 - 31
Exemplos
Input | Output |
---|---|
-0001 -0001 -0001 -0001 -0001 |
0xFFFFFFFF |
+0001 +0001 -0001 -0001 -0001 |
0xFFFFF021 |
+0003 -0002 +0025 +0030 +1000 |
0xD1C19FC3 |
+9999 +9999 +9999 +9999 +9999 |
0x1FF0F1EF |
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 SeuRA_lab5.report no Classroom com o relatório de execução gerado pelo assistente no simulador pelo link
- Qualquer alteração no arquivo de report será considerado fraude