O que é a máscara Bit?
Sou novo na programação C e encontrei um pouco de máscara. Alguém pode explicar-me o conceito geral e a função da máscara? Os exemplos são muito apreciados.
111
Author: hippietrail, 2012-05-08
1 answers
Uma máscara define quais bits você quer manter, e quais bits você quer limpar.
Mascarar é o ato de aplicar uma máscara a um valor. Isto é conseguido fazendo:- rodagem Bitwise a fim de extrair um subconjunto dos bits no valor
- Oração Bítmica para definir um subconjunto dos bits no valor
- XORing Bitwise para activar ou desactivar um subconjunto dos bits no valor
Abaixo está um exemplo de extrair um subconjunto do bits no valor:
Mask: 00001111b
Value: 01010101b
Aplicar a máscara ao valor significa que queremos limpar o primeiro (maior) 4 bits, e manter o último (menor) 4 bits. Assim, extraímos os 4 bits inferiores. O resultado é:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
Mascarar é implementado usando e, por isso em C temos:
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
Aqui está um caso de uso bastante comum: extrair bytes individuais de uma palavra maior. Nós definimos os bits de alta ordem na palavra como o primeiro byte. Nós usamos dois operadores para isso, &
, e >>
(shift direito). É assim que podemos extrair os quatro bytes de um inteiro de 32 bits:
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
Repare que pode mudar a ordem dos operadores acima, pode primeiro fazer a máscara, depois a mudança. Os resultados são os mesmos, mas agora você teria que usar uma máscara diferente:
uint32_t byte3 = (value & 0xff00) >> 8;
153
Author: user239558, 2012-05-08 06:40:00