Bitwise - Escovando os bits

Bitwise é uma técnica que consiste, basicamente, em alterar a sequência de bits de uma variável. Nesse artigo, pretendo mostrar como trabalhar com os principais operadores Bitwise na linguagem C.

[ Hits: 37.627 ]

Por: Paulo Dias em 06/02/2015 | Blog: http://naotenhosite.eu.nao.tenho


Colocando em prática



Nos exemplos anteriores utilizei os valores em base 10, mas em C também é possível especificar valores em binário e hexadecimal. Para isso, basta usar a seguinte sintaxe:

char a = 0b101; // binario
char b = 0xff; // hexa

Para tentar apresentar melhor esses operadores, vou usar como exemplo um controle de quartos de um hotel. Nesse controle, só é necessário saber se o quarto está livre ou se está ocupado. O hotel vai ter 8 quartos e vou armazenar as informações em uma única variável do tipo "char", ou seja, cada bit vai representar um quarto. Esse não é um exemplo realista, mas com ele é possível ter uma ideia de como trabalhar com operadores de bits.

O programa inicia assim:

int main(int argc, char **argv)
{
    char hotel;

    hotel = 0b101; //temos 2 quartos ocupados ( 0000 0101 )
    return 0; }

O primeiro passo é desenvolver uma função para verificar se um determinado quarto está ocupado:

// o quarto é um valor entre 0 e 7 inclusive,
// seria importante testar esse valor
int estaOcupado( char hotel, int quarto )
{
    char teste = 1; // 0000 0001

    // rotaciona para que o bit ligado fique no quarto desejado
    teste = teste << quarto;

    // se o retorno for diferente de 0 o quarto esta ocupado
    return hotel & teste;
}

int main(int argc, char **argv)
{
    char hotel;

    hotel = 0b101;

    if( estaOcupado( hotel, 0 ) )
        printf(" O quarto 0 esta ocupado \n" );

   return 0;
}

Agora vou desenvolver uma função para ocupar um quarto:

void ocuparQuarto( char* hotel, int quarto )
{
    char teste = 1; // 0000 0001

    teste = teste << quarto;

    // o bit ligado do teste garante que o quarto vai ficar ocupado,
    // os outros bits do teste estão desligados e não vão alterar o hotel
    *hotel = *hotel | teste;
}

int estaOcupado( char hotel, int quarto )
{
    char teste = 1; // 0000 0001

    teste = teste << quarto;

    return hotel & teste;
}

int main(int argc, char **argv)
{
    char hotel;

    hotel = 0b101;

    if( estaOcupado( hotel, 1 ) )
       printf(" O quarto 1 esta ocupado \n" );
    else
       printf(" O quarto 1 nao esta ocupado \n" );

    ocuparQuarto( &hotel, 1 );

    if( estaOcupado( hotel, 1 ) )
      printf(" O quarto 1 esta ocupado \n" );
    else
      printf(" O quarto 1 nao esta ocupado \n" );

   return 0;
}

Por último, tenho uma função para liberar um quarto:

void liberarQuarto( char* hotel, int quarto )
{
     char teste = 1; // 0000 0001

     teste = teste << quarto;

     // inverte o teste, 0000 0001 fica 1111 1110
     teste = ~teste;

     // o bit desligado do teste garante que o quarto vai ser liberado,
     // os bits ligados do teste não alteram o hotel.
     *hotel = *hotel & teste;
}

void ocuparQuarto( char* hotel, int quarto )
{
     char teste = 1; // 0000 0001

     teste = teste << quarto;

     *hotel = *hotel | teste;
}

int estaOcupado( char hotel, int quarto )
{
     char teste = 1; // 0000 0001

     teste = teste << quarto;

     return hotel & teste;
}

int main(int argc, char **argv)
{
    char hotel;

    hotel = 0b101;

    if( estaOcupado( hotel, 1 ) )
       printf(" O quarto 1 esta ocupado \n" );
    else
       printf(" O quarto 1 nao esta ocupado \n" );

    ocuparQuarto( &hotel, 1 );

    if( estaOcupado( hotel, 1 ) )
       printf(" O quarto 1 esta ocupado \n" );
    else
       printf(" O quarto 1 nao esta ocupado \n" );

    liberarQuarto( &hotel, 1 );

    if( estaOcupado( hotel, 1 ) )
       printf(" O quarto 1 esta ocupado \n" );
    else
       printf(" O quarto 1 nao esta ocupado \n" );

    return 0;
}

Bom pessoal, é isso.

Espero que seja útil para alguém. :)

Página anterior    

Páginas do artigo
   1. Os operadores
   2. Colocando em prática
Outros artigos deste autor

MathML - Mathematical Markup Language

Zoneminder: Substituindo um Unifi NVR

Programação com Shell Script

Servidor FTP externo no Ubuntu 12.04 - Criação e configuração

JavaScript - Programação orientada a objetos

Leitura recomendada

Algoritmos em Shell Script

Introdução ao Fortran (parte 1)

Recursos avançados do bash que você não aprende na escola

Cobrando com o SQUID

Pipelines (Canalizadores)

  
Comentários
[1] Comentário enviado por mcirqueira em 11/02/2015 - 18:36h

foi util sim, muito, vlw, :)

[2] Comentário enviado por Azraelm em 10/09/2016 - 19:23h

Bom artigo. o/

[3] Comentário enviado por di4s em 12/09/2016 - 23:39h

Valeu.



Linux Professional Institute - LPIC-1
Novell Certified Linux Administrator - CLA
Oracle Certified Associate, Java SE Programmer - OCA

http://twitter.com/p4ulodi4s
http://www.prminformatica.com.br/


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts