unsigned int mul (unsigned int a, unsigned int b) { unsigned int p = 0; while (b) { if (b%2 == 1) p += a; a *= 2; b /= 2; } return p; }Na forma apresentada acima, a função
mul
não faz
muito sentido,
pois usamos várias multiplicações e divisões para simular uma
única multiplicação.
Entretanto, como essas operações são todas com 2,
podemos substituí-las por operadores bit-a-bit,
que são bem mais eficientes.
Reescreva a função mul
de modo que ela não use nenhuma
das operações *
, /
ou %
.
Escreva também uma função main
para testá-la.
Considere um protocolo que usa um "pacote" de 32 bits de informação com o seguinte formato:
BITS: | 31 | 30 - 27 | 26 - 20 | 19 - 16 | 15 | 14 | 13 | 12 | 11 - 0 |
CONTEÚDO: | paridade | num. sequencia | fill | versão | f1 | f2 | f3 | prioridade | informação |
Escreva funções em C para realizar as manipulações descritas a seguir. Todas as funções recebem um "pacote" armazenado em um unsigned int.
int isPrio(unsigned int pacote);
Você pode testar sua função com o programa abaixo (converta os valores de hexa para binário para verificar os valores dos diferentes "campos" do pacote...)
int main() { unsigned int pacote1 = 0x7801E3A2; unsigned int pacote2 = 0x0801FBA2; unsigned int novopacote; printf("prio pac1 = %s\n", isPrio(pacote1) ? "S" : "N"); printf("prio pac2 = %s\n", isPrio(pacote2) ? "S" : "N"); return 0; }
int getSeq(unsigned int pacote);
Modifique a função main
para testar a nova função getSeq
.
unsigned int incrSeq(unsigned int pacote);
Modifique a função main
para testar a nova função incrSeq
(você pode usar getSeq para mostrar o valor antes e após o incremento).
unsigned int setParity(unsigned int pacote);A deve função retornar o novo valor do "pacote". Modifique novamente a função
main
para testar a nova função setParity
.