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: 38.840 ]
Por: Paulo Dias em 06/02/2015 | Blog: http://naotenhosite.eu.nao.tenho
char a = 0b101; // binario char b = 0xff; // hexa
int main(int argc, char **argv)
{
char hotel;
hotel = 0b101; //temos 2 quartos ocupados ( 0000 0101 )
return 0;
}
// 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;
}
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;
}
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;
}
Como criar um box para o Vagrant
MathML - Mathematical Markup Language
Zoneminder: Substituindo um Unifi NVR
JavaScript - Programação orientada a objetos
Como trabalhar com funções em bash
Introduzindo um pouco mais a fundo o shell script
Introdução ao Shell Script (parte 2)
Como atualizar sua versão estável do Debian
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (7)
De volta para o futuro - ou melhor, para o presente (parte 2) (0)









