Guest Posted March 24, 2012 Report Share Posted March 24, 2012 Tenho este codigo mas estou com alguma dificuldade em dissecá lo se. #include<stdio.h> unsigned getbits(unsigned x, int p, int n) { return (x >> (p+1-n)) & ~(~0 << n); } int main(void) { unsigned x = 8; int p = 4; int n = 3; printf("%d",getbits(x,p,n)); return 0; } (x >> (p+1-n)) Esta parte dá 2 logo 010. ~(~0 << n) Aqui é que não estou a perceber muito bem quantos 1 é que necesito para o ~0. Desde já obrigado pelo tempo concedido Link to comment Share on other sites More sharing options...
pmg Posted March 24, 2012 Report Share Posted March 24, 2012 Isto isola n bits a partir da posicao p do valor em x. A parte do ~(~0 << n) faz-te um numero cuja expansao em binario termina em n 1's o ~0 e uma sequencia de 1's; com o shift para a esquerda de n bits fica um numero que e so 1's excepto os n bits da direita que sao 0's e depois o ~ externo troca todos os 1's por 0's e vice-versa Imagina que x = 0xFF08; p = 4; e n = 3 1111111100001000 >> 2 0011111111000010 & 0000000000000111 [ ~(~0 << 3) ] 0000000000000010 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Guest Posted March 24, 2012 Report Share Posted March 24, 2012 ~0 << 3 não séria 0000000000000011 uma vez que 3 é 011 ? Link to comment Share on other sites More sharing options...
pmg Posted March 24, 2012 Report Share Posted March 24, 2012 ~0 << 3 não séria 0000000000000011 uma vez que 3 é 011 ? Nao. O operador << desloca para a esquerda o primeiro operando tantos bits quantos o valor do segundo operando, ou seja, multiplica por 2 levantado ao valor do segundo operando. ~0 é 11111111111111111111111 111111111111111111111 deslocado para a esquerda 3 bits é 11111111111111111000 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Guest Posted March 24, 2012 Report Share Posted March 24, 2012 Ah ok. Obrigado Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now