Ir ao conteúdo

c++ - como usar os bits?


Cambalinho

Posts recomendados

Postado

os manuais mostram numeros biinarios e como utilizar as operaçoes binarias. mas continuo com muitas duvidas :(

na programaçao para windows(windows API\win32) temos, por exemplo, a mensagem WM_KEYDOWN e os parametros wparam, lparam.

eu preciso de explicaçoes sobre o lparam. ele tem 1 valor que eu posso lidar com bits... mas eu estou confuso:

1- se as operaçoes, que nos ensinam os manuais, sao em binario... o valor do lparam tambem é binario ou tenho de converter para binario?

2 - num valor binario, como posso saber quais saos os bits da posiçao x ate á posiçao y?

Postado

nao precisa ta em binario(até porque nao tem como ter uma representação binaria(pelo que eu sei)em C++),geralmente os valores na API são mapeados bit a bit,talvez por isso eles sejam mostrados mais em forma binaria(isso é só um palpite..)é bom usar as constantes definidas pra evitar erros mesmo que voce saiba o valor dela,e pra melhor legibilidade

 

por exemplo em C++ pra voce saber quais os bits na posição x até y,voce teria que saber a representação do numero em decimal tambem ou em HEX

const unsigned short binarin = 68;   //0100 0100//se quiser mapear os bits 0 e 1 do valor em "binarin" pra ver se tem algum bit setado,eu poderia //fazer um AND com o numero 3(0011)unsigned short num2 = 3;         //0000 0011unsigned short n2 = (binarin & num2);    //n2 teria o valor 0 porque                                          //0000 0011                                         //0100 0100                                     //AND=0000 0000  //agora se eu quisesse mapear os bits 1 e 2 de binarin n2 = (num2 << 1);                               //Desloca os bits de num2 uma posição,atualmente n2 teria 0000 0110  n2 = n2 & binarin;                              //agora n2 teria o valor 4 porque                                                 //0000 0110                                          //binarin = 0100 0100                                        //AND =    0000 0100     = dois 1 na mesma posição é 1

 C++ tambem tem a classe bitset que lida com esse tipo de coisa


espero que tenha sido que perguntou..

Postado

nao precisa ta em binario(até porque nao tem como ter uma representação binaria(pelo que eu sei)em C++),geralmente os valores na API são mapeados bit a bit,talvez por isso eles sejam mostrados mais em forma binaria(isso é só um palpite..)é bom usar as constantes definidas pra evitar erros mesmo que voce saiba o valor dela,e pra melhor legibilidade

 

por exemplo em C++ pra voce saber quais os bits na posição x até y,voce teria que saber a representação do numero em decimal tambem ou em HEX

const unsigned short binarin = 68;   //0100 0100//se quiser mapear os bits 0 e 1 do valor em "binarin" pra ver se tem algum bit setado,eu poderia //fazer um AND com o numero 3(0011)unsigned short num2 = 3;         //0000 0011unsigned short n2 = (binarin & num2);    //n2 teria o valor 0 porque                                          //0000 0011                                         //0100 0100                                     //AND=0000 0000  //agora se eu quisesse mapear os bits 1 e 2 de binarin n2 = (num2 << 1);                               //Desloca os bits de num2 uma posição,atualmente n2 teria 0000 0110  n2 = n2 & binarin;                              //agora n2 teria o valor 4 porque                                                 //0000 0110                                          //binarin = 0100 0100                                        //AND =    0000 0100     = dois 1 na mesma posição é 1

 C++ tambem tem a classe bitset que lida com esse tipo de coisa

espero que tenha sido que perguntou..

muito obrigado por responderes.

eu percebo o &, |, ~.. mas ainda estou confuso com o << ou >> binario. a que a API nos dá 1 valor binario.. ve este exemplo:

 

1110111

 

imagina que quero o bit 1? e o 4? como os calculo?(bits individuais)

imagina que quero os bits 5 e 6... como os calculo?(bits em conjunto)

estas questoes sao o meu problema :(

Postado

"<< "(shift)desloca para a esquerda a quantidade de vezes passada no operando  e " >>" desloca para a direita a quantidade de vezes passada no operando,é isso..

 

só pra fica claro,o bit 1 é na posição 1(2º bit)certo?se quer saber se o bit 1 ou o 4 estão setados(= 1) voce pode testar usando um deslocamento "<<" do valor 1 = 0000 0001

 

por exemplo,testar o bit 4 do valor 0111 0111 seria

unsigned short num4 = 119;   //0111 0111n2 = (1 << 4)                //desloca os bits de 1,4 posições para a esquerda n2 atualmente tem 0001 0000resultado = n2 & num4;                   //faz AND com o valor 0111 0111                                                       //n2=   0001 0000                                                 //resultado = 0001 0000 = 16

Pra testar só o bit 1,deslocaria 1 vez,pra testar os bits 5 e 6 juntos,voce pode fazer um AND com o numero 96 = 0110 0000

unsigned short num4 = 119;   //0111 0111n2 = num4 & 96;                     //0110 0000

ou então deslocar o numero 3 até o bit 5 e fazer um AND

unsigned short num2 = 3;         //0000 0011n2 = num2 << 5;                  //n2 teria agora  0110 0000           resultado = n2 & num4;           //resultado teria o valor 96 = 0110 0000 
Postado
(até porque nao tem como ter uma representação binaria(pelo que eu sei)em C++)

 

PS:Só pra me corrigir quando eu disse isso,eu quis dizer que nao tem como fazer isso usando uma representação como tem pra HEX(0x00000000)

 

mesmo assim voce pode ter esse mesmo efeito pra binarios(onde binarios são realmente os bits)do numero usando uma estrutura com campos de bit e evitando o preenchimento do compilador

#pragma pack(1)struct numerobin{unsigned short bit0 : 1unsigned short bit1 : 1unsigned short bit2 : 1//etc..};#pragma pack()

é melhor nao confiar muito no que eu digo de noite(e de manhã tambem)

Postado

PS:Só pra me corrigir quando eu disse isso,eu quis dizer que nao tem como fazer isso usando uma representação como tem pra HEX(0x00000000)

 

mesmo assim voce pode ter esse mesmo efeito pra binarios(onde binarios são realmente os bits)do numero usando uma estrutura com campos de bit e evitando o preenchimento do compilador

#pragma pack(1)struct numerobin{unsigned short bit0 : 1unsigned short bit1 : 1unsigned short bit2 : 1//etc..};#pragma pack()

é melhor nao confiar muito no que eu digo de noite(e de manhã tambem)

;)

muito obrigado por tudo amigo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!