Skip to content

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)

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

lab5

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