A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Tutoriais e Programação

Linguagem C - Uma janela de verdade

Sex

28

Nov

2008


10:57

(7 votos, média 4.43 de 5) 


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:

if (minhasFlags & 128) { ... } ou oitavo_bit = 128; if (minhasFlags & oitavo_bit) { ... }

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á:

tiraBit = 8; // (0000 0000 0000 1000) complTira ~= tiraBit; // (1111 1111 1111 0111) minhasFlags &= complTira; // (0000 0000 1000 1000) // (1111 1111 1111 0111) // --------------------- // (0000 0000 1000 0000) ou diretamente tiraBit = 8; minhasFlags &= ~tiraBit;

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.

mfx brokerкупить набор кистейооо полигон харьковблендеры отзывыновости погодыmfx brokertopodin отзывы

Informações adicionais