cassio_fd Postado Outubro 24, 2010 Denunciar Share Postado Outubro 24, 2010 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Durub Postado Outubro 24, 2010 Denunciar Share Postado Outubro 24, 2010 Então... como funciona.Três partes: <--------2------><--3--> <----1---> return (b >> (qual - 1)) & 0x1;1Por 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.2O shift. Conhece o operador shift? Ele "transporta" n bits para a direita ou esquerda, mas sem rotacionar.Exemplo:2 >> 1Decimal: 2Binário: 00100010 >> 1 = 00016 >> 1Decimal: 6Binário: 01100110 >> 1 = 00116 >> 2Decimal: 6Binário: 01100110 >> 2 = 0001Ou 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.3O 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 & 110 & 01 = 003 & 111 & 01 = 01 (decimal 1)6 & 4110 & 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 1getBit(18, 1);18 DEC -> 10010 BIN1:qual - 1 = 1 - 1 = 02:10010 >> 0 = 100103:10010 & 0x01 = 00000getBit retorna 0.Exemplo 2getBit(7, 2);7 DEC -> 0111 BIN1:qual - 1 = 2 - 1 = 12:0111 >> 1 = 00113:0011 & 0x01 = 0001getBit retorna 1.Entendeu?Abraços! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 cassio_fd Postado Outubro 25, 2010 Autor Denunciar Share Postado Outubro 25, 2010 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 aiaahuahaValeu pela ajuda! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
cassio_fd
Olá pessoal, sou novo aqui e tenho uma dúvida no codigo que meu prof da facul passou.
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
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.