Máscaras de bits
July 23, 2009
[Warning: This post is a backup recovery from my previous Wordpress blog. All content was automatically converted accessing a MySQL database using a Python script (details). Mostly are in Portuguese but if you are interest I can translate to English. If you found any problem dont’t hesitate to contact me in comments.]
Este é um pequeno resumo para utilizar máscara-de-bits quando você precisar armazenar flags booleanas em uma única variável inteira. Abaixo estão dois exemplos, um em C e outro em Python.
Linguagem C
#define FLAG_TEMPERATURA 1
#define FLAG_ALARME_1 2
#define FLAG_ALARME_2 4
#define FLAG_INTERRUPCAO 8
Lembre-se de organizar em potências de 2.
1) Para verificar o valor utilize a lógica AND:
if (flags & FLAG_TEMPERATURA) {
/* ... */
}
2) Para setar em TRUE o valor, utilize a lógica OR:
flags |= FLAG_ALARME_1;
3) Para setar em FALSE o valor, utilize a lógica AND e NOT:
flags &= ~FLAG_ALARME_2;
Python
#!/usr/bin/python
FLAG_TEMPERATURA = 1<<0 # 1
FLAG_ALARME_1 = 1<<1 # 2
FLAG_ALARME_2 = 1<<2 # 4
FLAG_INTERRUPCAO = 1<<3 # 8
# comeca setando a flag
flags = FLAG_TEMPERATURA
# verificando se a FLAG_INTERRUPCAO esta ativa
if flags & FLAG_INTERRUPCAO:
print "FLAG_INTERRUPCAO: TRUE"
else:
print "FLAG_INTERRUPCAO: FALSE"
# anexa outra flag
flags |= FLAG_INTERRUPCAO
# verificando se a FLAG_INTERRUPCAO esta ativa
if flags & FLAG_INTERRUPCAO:
print "FLAG_INTERRUPCAO: TRUE"
else:
print "FLAG_INTERRUPCAO: FALSE"
# a FLAG_TEMPERATURA continua como esta:
if flags & FLAG_TEMPERATURA:
print "FLAG_TEMPERATURA: TRUE"
else:
print "FLAG_TEMPERATURA: FALSE"
# volta-se ao estado inicial (false)
flags &= ~FLAG_INTERRUPCAO
# novo status da FLAG_INTERRUPÇãO
if flags & FLAG_INTERRUPCAO:
print "FLAG_INTERRUPCAO: TRUE"
else:
print "FLAG_INTERRUPCAO: FALSE"