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.
Parte 2: 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:
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:
O primeiro passo é desenvolver uma função para verificar se um determinado quarto está ocupado:
Agora vou desenvolver uma função para ocupar um quarto:
Por último, tenho uma função para liberar um quarto:
Bom pessoal, é isso.
Espero que seja útil para alguém. :)
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. :)