Tutoriais e Programação
Linguagem C - Uma janela de verdade
Sex 28 Nov 2008 10:57 |
- Detalhes
- Categoria: Linguagem C
- Atualização: Sexta, 28 Novembro 2008 12:09
- Autor: vovó Vicki
- Acessos: 24403
Mais sobre flags e operações binárias
Aproveitando o embalo, é bom saber um pouco mais sobre flags (bandeiras) e como tratá-las. Na programação C é muito importante saber lidar com bits e, como já disse acima, flags são os bits em "tripas" de bits, onde cada bit representa uma informação específica.
Um número inteiro nos disponibiliza até 32 bits, ou seja, 32 flags. Também já falei sobre a regrinha do bit único: números que sejam potências da base 2 possuem apenas 1 bit ligado. Assim, numa flag de 32 bits, os números que "ligam" as bandeiras únicas são 1, 2, 4, 8, 16, 32, 64, 128, 256... até 2 elevado à potência 31 (que corresponde a 2.147.483.648). Na representação binária temos:
0000 0000 0000 0000 0000 0000 0000 0001 1 2 elevado a 0 0000 0000 0000 0000 0000 0000 0000 0010 2 2 elevado a 1 0000 0000 0000 0000 0000 0000 0000 0100 4 2 elevado a 2 0000 0000 0000 0000 0000 0000 0000 1000 8 2 elevado a 3 0000 0000 0000 0000 0000 0000 0001 0000 16 2 elevado a 4 ... 1000 0000 0000 0000 0000 0000 0000 0000 2.147.483.648 2 elevado a 31
Observe que as potências da base 2 indicam exatamente a posição do bit ligado se os numerarmos da direita para a esquerda a partir de 0. Por exemplo, 16 corresponde a 2 elevado a 4, portanto o bit 4 (o quinto bit da direita para a esquerda) estará ligado. No caso das flags não é propriamente o número que nos interessa, mas sim o(s) bit(s) ligados.
Ligando flags
Digamos que possuímos uma variável de nome minhasFlags, manifestada como número short (16 bits). Se quisermos ligar o oitavo bit, nem é preciso fazer muita ginástica: basta atribuir minhasFlags=128 para ligarmos o bit desejado (2 elevado a 7 é igual a 128).
Se quisermos ligar mais de um bit, por exemplo o oitavo e o quarto, uma das maneiras é somar os valores para cada bit. Como 2 elevado a 7 é igual a 128 e 2 elevado a 3 é 8, a soma é 128+8=136 que, em binário, corresponde a 1000 1000. Na mosca!
A operação binária OR faz a mesma coisa, porém de forma mais elegante. Lembrando, o operador de OR é | e a operação OR mantém TODOS os bits ligados dos dois operandos:
1000 0000 OR 0000 1000 = 1000 1000 (em binário) ou 1000 0000 | 0000 1000 = 1000 1000 (em binário) ou 128 | 8 = 136 (em decimal)
Para ligar estes bits em minhasFlags usamos:
minhasFlags = 136; ou minhasFlags = 0; minhasFlags |= 128; minhasFlags |= 8;
Testando flags
Digamos que não saibamos qual é o valor da variável minhasFlags, ou seja, desconhecemos os bits que estão ligados. Se quisermos determinar quais são as flags ativas, usamos a operação lógica binária AND (cuja tradução é E).
A operação AND mantém apenas os bits que estiverem ligados nos dois operandos. O operador de AND é &. Se quisermos testar se o oitavo bit de minhasFlags está ligado, basta fazer um AND com minhasFlags e 128. Veja abaixo:
minhasFlags armazena o valor 136 que, em binário, corresponde a 0000 0000 1000 1000 Queremos saber se o oitavo bit está ligado, ou seja, 0000 0000 1000 0000 (ou 128 decimal) 0000 0000 1000 1000 (136) AND 0000 0000 1000 0000 (128) ------------------- 0000 0000 1000 0000 (128)
136 & 128 = 128 nos indica que o oitavo bit está ligado. O mesmo pode ser feito com o quarto bit pois, 136 & 8 = 8. Se testarmos o terceiro bit, por exemplo, obtemos 136 & 4 = 0. O resultado nulo nos indica que o terceiro bit está desligado. Veja como programar:
Desligando bits
Desligar bits exige uma operação engraçada, chamada de complemento. O complemento simplesmente inverte os bits: todos os ligados são desligados e todos os desligados são ligados. Assim, 0000 1000 é transformado em 1111 0111. A operação de complemento transformou 8 (0000 1000) em 247 (1111 0111)!
Mas como não estamos nem um pouquinho preocupados com o valor decimal da nossa tripinha de bits, o que vale é o raciocínio "bital": se trocarmos todos os bits e depois fizermos um AND, qual será o resultado? Acompanhe abaixo:
Queremos desligar o bit 3 -> 0000 0000 0000 1000 Fazemos o complemento -> 1111 1111 1111 0111 Agora um AND com minhasFlags -> 0000 0000 1000 1000 ------------------- E o resultado é -> 0000 0000 1000 0000
Ahá!!! Apenas o quarto bit (o de número 3) foi desligado - todos os outros permaneceram inalterados. Agora só falta explicar que o operador para a operação de complemento é ~. Uma declaração em C que desligue o quarto bit será:
Observações da vó
Deu para entender porque existe a expressão "escovador de bits"?
Imagino que agora todo mundo esteja meio intoxicado e não é bem esta a proposta deste tutorial. Além do mais, não devemos perder de vista que o objetivo é programar uma janela que sirva para algum propósito - não é uma boa idéia ficar só no esqueleto. Mas, como sou abusada, dá-lhe mais um pouco de teoria: o assunto do próximo tutorial são as Estruturas e as Uniões. Se você ainda não leu o texto, conforme sugerido acima, anime-se! Se você já leu e, principalmente, se entendeu... tá legal, pule o tutorial.
- << Anterior
- Próximo