Skip to content

🧪 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)

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

lab5

📥 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