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. Setando bytes
  7. Resetando bytes
  8. Invertendo ordem de bytes
  9. macros iso646.h
  10. Percorrendo bits

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("%02X",resultado);

    return 0;
}
Saída
18

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("%02X",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

Para resetar um ou mais bytes específicos, utilizamos uma máscara de bytes semelhante ao que foi visto para resetar bits. Essa máscara corresponde ao(s) byte(s) desejado(s) sendo aplicada a operação (&) como visto a seguir:

Exemplo 6:
#include <stdio.h>


int main()
{

    unsigned int valor = 0x01234567, 
                mascara = 0xffff00ff;
    
    printf("%08x", valor&mascara);
}
Saída
01230067

De forma semelhante ao que foi visto em setar bits, utilizamos uma máscara que corresponde ao(s) byte(s) que será(ão) setado(s) e aplicamos a operação (|) com um valor desejado como mostrado abaixo:

Exemplo 7:
#include <stdio.h>


int main()
{

    unsigned int valor = 0x01230067, 
                mascara = 0x00004500;
    
    printf("%08x", valor|mascara);
}
Saída
01234567
  1. 27/04/2026 - revisão 1 - Correção: link objetivo 'testando bits' Adição: 'resetando byte' e 'setando byte'
  2. 21/10/2025 - versão inicial: setar, resetar, testar, recuperar e inverter bits