jul
23
2009

Máscaras de bits

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"

posted in programação by Tiago Maluta

Follow comments via the RSS Feed | Deixe um comentário | Trackback URL

Leave Your Comment