Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Setando bits
  2. Resetando bits
  3. Testando bits
  4. Invertendo bits
  5. Recuperando bits
  6. Percorrendo bits
  7. Setando/Resetando bytes
  8. Invertendo ordem de bytes
  9. macros iso646.h

A manipulação em baixo nível de bits e bytes é comum em aplicações como: editores hexadecimais, assemblers, disassemblers, interpretadores de linguagens bytecode, ferramentas debuggers, emuladores e outros.

Neste tópico, vamos aprender o básico sobre a manipulação de bits como: resetar bits, setar bits, inverter bits e deslocar bits. Isso será feito utilizando os operadores bitwise vistos em C: Operadores > Bitwise.

O set de um ou mais bits é feito utilizando o operador (|). Uma máscara é utilizada para informar quais bits devem ser mantidos(0) e quais devem ser setados(1).

Sintaxe:
nome_variavel & mascara

Assim, ao aplicar o operador acima temos apenas os bits necessários setados em suas posições:

Exemplo 1
#include <stdio.h>

int main()
{
    unsigned char variavel = 0x00;
    
    unsigned char resultado = variavel | 0b00011000; //0x18
    
    printf("%x",resultado);

    return 0;
}
Saída
30

O reset de um ou mais bits é feito utilizando o operador (&). Uma máscara é utilizada para informar quais bits devem ser mantidos(1) e quais devem ser resetados(0).

Sintaxe:
nome_variavel & mascara

Assim, ao aplicar o operador acima temos apenas os bits necessários resetados em suas posições:

Exemplo 2
#include <stdio.h>

int main()
{
    unsigned char variavel = 0xff;
    
    unsigned char resultado = variavel & 0b00011000; //0x18
    
    printf("%x",resultado);

    return 0;
}
Saída
18

O operador (&) também pode ser utilizado indiretamente para testar bits. Modificando o exemplo acima, podemos adicionar o comando if ou switch para verificar o valor dos bits testados:

Exemplo 3: if
#include <stdio.h>

int main()
{
    unsigned char variavel = 0x00;
    
    unsigned char resultado = variavel & 0b000110000; //(variavel | 0b000110000) == 0x30
    
    if(resultado == 0x30)
        printf("valor valido");
    else
        printf("valor inválido");

    return 0;
}
Saída
valor inválido
Exemplo 4: switch
#include <stdio.h>

int main()
{
    unsigned char variavel = 0x00;
    
    unsigned char resultado = variavel | 0b00011000; // //0x18
    
    switch(resultado)
    {
        case 0x00: printf("0"); break;
        case 0x10: printf("1"); break;
        case 0x20: printf("2"); break;
        case 0x30: printf("3"); break;
    }

    return 0;
}
Saída
3

A inversão de bits é feita utilizando os operadores (~) e (^). O primeiro inverte todos os bits de um valor e o segundo a inversão é feita utilizando uma máscara de bits.

Para usar o operador (^), precisamos definir quais bits devem ser invertidos(1) e mantidos(0). Para isso, é necessário ter em mente a tabela verdade desse operador:

Tabela:
1 ^ 1 = 0
1 ^ 0 = 1
Exemplo 5:
#include <stdio.h>

int main()
{
    unsigned char variavel = 0xff;
    
    unsigned char resultado = variavel ^ 0b00011000; //0x18
    
    printf("%x",resultado); //0xe7 %11100111

    return 0;
}
Saída
e7

Nos exemplos acima setamos e resetamos bits em suas posições. Isso pode dificultar, de alguma forma, a comparação de valores com o comando if e switch.

Tabela:
valor == 0x30 //sem deslocamento
valor == 3 //com deslocamento

Usando os operadores (>>) e (<<) podemos recuperar esses bits específicos como mostrado no exemplo abaixo:

Sintaxe:
nome_variavel operador qtd_bits
Exemplo 6:
#include <stdio.h>

int main()
{
    unsigned char variavel = 0xff;
    
    unsigned char resultado = variavel & 0b00011000; //0x18

    resultado = resultado >> 3;    //0b00000011
    
    printf("%x",resultado); //3

    return 0;
}
Saída
3

Usando os operadores (&), (<<) e (>>) podemos criar uma macro para testar apenas 1 bit específico.

Sintaxe:
#define TESTAR_BIT(valor, posicao) (((valor) & (1 << (posicao))) >> posicao)
Exemplo 7:
#include <stdio.h>

#define TESTAR_BIT(valor, posicao) (((valor) & (1 << (posicao))) >> posicao)

int main()
{
    unsigned char variavel = 0xff;
    
    unsigned char flag = TESTAR_BIT(variavel,4); //00010000
    
    printf("%x",flag); //1

    return 0;
}
Saída
1
  1. 21/10/2025 - versão inicial: setar, resetar, testar, recuperar e inverter bits