Novidade: Metaperguntas agora no próprio Umamão

3

Compreendo o funcionamento das operações bit a bit e sei chegar nos resultados abaixo:

2 & 2 = 2
4 & 8 = 0
2 & 10 = 2

Exemplo do 2 & 10:
0x0010 &
0x1010 =
------
0x0010

Porém estou com dificuldades de aplicar estes conceitos na prática.
Alguém poderia explicar a resposta do exercício abaixo, retirado desta lista?

Considere int val=0xCAFE;. Escreva uma expressão, usando operadores bit-a-bit, que faça o seguinte:

(c) rotacione grupos de quatro bits (i.e., produza val=0xECAF)

Resposta: val = (val >> 4) | ((val&0xF)<<12)

flag

2 Answers

2

Em primeiro lugar, C não tem uma operação de rotação de bits, somente a de shift, >> e <<.

Então, nessa resposta, dois shifts são feitos:

  • O shift esperado de quatro bits para a direita (val >> 4) vai devolver 0x0CAF.
  • E o shift dos quatro últimos bits (val&0xF) --- os que deveriam ter wrapped pro outro lado --- 12 bits para a esquerda ((val&0xF)<<12), justamente para simular esse wrap. Esta operação devolve 0xE000.

Depois se faz o OU desses dois valores:

0x0CAF | 0xE000 = 0xECAF

link|flag
Obrigada, ajudou bastante! É muito mais fácil entender lendo o passo a passo... – andreavb Jul 28 at 13:25
1

Isto deveria ser um comentário, IMHO, mas não consegui formatar por lá. Por isso, fica como resposta mesmo! Caso alguém tenha tido dificuldades também, veja abaixo:

andreavb@zugzwang:~/mit/lec02$ cat rotate.c

#include <stdio.h>
int main () {
  int t1, t2;
  int val = 0xCAFE;
  t1 = val >> 4;
  printf ("First step: %X >> 4 = %X\n", val, t1);
  t2 = (val & 0xF);
  printf ("Second step: %X & 0xF = %X\n", val, t2);
  t2 = t2 << 12;
  printf ("Third step: %X << 12 = %X\n", val, t2);
  val = t1 | t2;
  printf ("Last step: %X | %X = %X\n", t1, t2, val);
  return 0;
}

andreavb@zugzwang:~/mit/lec02$ ./rt

First step: CAFE >> 4 = CAF
Second step: CAFE & 0xF = E
Third step: CAFE << 12 = E000
Last step: CAF | E000 = ECAF
link|flag
1 
Isso é uma resposta, então faz sentido postá-la separadamente mesmo. Não tem problema em ter respostas que são "releituras" de outra. Obrigado por postar essa, ficou bem ilustrativa. – Helder Ribeiro Jul 29 at 0:18

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.