Ir para conteúdo
Fórum Script Brasil
  • 0

operadores logicos bit a bit


cassio_fd

Pergunta

Olá pessoal, sou novo aqui e tenho uma dúvida no codigo que meu prof da facul passou.

#include <stdio.h>
#include <stdlib.h>

unsigned char getBit(unsigned char b, char qual) {
  return(b >> (qual - 1)) & 0x1; //não ENTENDI
}



main() {
  unsigned char a, b, c;
  a = 0xF3;
  b = getBit(a, 4);
  printf("%d\n", B);
  system("pause");
}

Não to conseguindo entender muito bem o hexadecimal com operador bit a bit que desloca os bits.

Alguém pode dar uma luz??

Valeu!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Então... como funciona.

Três partes:
       <--------2------><--3-->
             <----1--->
return (b >> (qual - 1)) & 0x1;

1

Por que ele subtrai 1 do qual? Porque se não o fizesse, o bit começaria por 0, como a maioria das coisas na programação. Para nós isso não é tão intuitivo, pois geralmente tudo começa com 1.

Então, se você quer pegar o bit 1:

qual - 1 = 1 - 1 = 0 (bit zero)

Isto vai ser aparente no 2.

2

O shift. Conhece o operador shift? Ele "transporta" n bits para a direita ou esquerda, mas sem rotacionar.

Exemplo:

2 >> 1

Decimal: 2

Binário: 0010

0010 >> 1 = 0001

6 >> 1

Decimal: 6

Binário: 0110

0110 >> 1 = 0011

6 >> 2

Decimal: 6

Binário: 0110

0110 >> 2 = 0001

Ou seja, aqui ele rotaciona o bit que você quer pegar para ser o primeiro. (pensando da direita para a esquerda)

Se você não quer transportar nada (que é o caso de quando você quer pegar o primeiro bit), você transporta "0" bits. Por isso a diminuição de 1 do valor de qual.

3

O que ele faz aqui é transformar o bit que você quer em um valor booleano, 0 ou 1. O seu bit já está lá, sendo o primeiro da direita para a esquerda, e agora, o que faz para isolá-lo? Você faz um AND com 1.

Conhece a operação AND? 0 com 0, 0; 0 com 1, 0; 1 com 1; 1.

2 & 1

10 & 01 = 00

3 & 1

11 & 01 = 01 (decimal 1)

6 & 4

110 & 010 = 010 (decimal 4)

O AND é feito com 0x01, pois em binário, 0x01 só tem o bit mais da direita ativo. Ou seja, quando você quer pegar o bit mais da direita, você faz um AND de todo o valor com 0x01, e isto te retornará esse bit. A sua variável fica com valor 0 ou com o valor 1, só um desses dois.

Exemplo 1

getBit(18, 1);

18 DEC -> 10010 BIN

1:

qual - 1 = 1 - 1 = 0

2:

10010 >> 0 = 10010

3:

10010 & 0x01 = 00000

getBit retorna 0.

Exemplo 2

getBit(7, 2);

7 DEC -> 0111 BIN

1:

qual - 1 = 2 - 1 = 1

2:

0111 >> 1 = 0011

3:

0011 & 0x01 = 0001

getBit retorna 1.

Entendeu?

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, não consegui entender esta parte, porque eu tenho q isolar ele?

"Ou seja, aqui ele rotaciona o bit que você quer pegar para ser o primeiro. (pensando da direita para a esquerda)

Se você não quer transportar nada (que é o caso de quando você quer pegar o primeiro bit), você transporta "0" bits. Por isso a diminuição de 1 do valor de qual."

To a tarde toda tentando isso, mas não entendo!! To parecendo retardado aiaahuaha

Valeu pela ajuda!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...