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.

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