Nesta aula vamos aprender como funciona o operador OR ( | ) bit a bit, na linguagem de programação C. Com esta operação é possível ativar, ligar um determinado bit, setando seu valor para 1.
A operação bit a bit ou ( | ) é muito semelhante à operação || que já conhecemos, inclusive possui a mesma tabela verdade.
A | B | A & B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
A operação é realizada sobre cada bit. Assim, no resultado final cada bit será 0 apenas se ambos os bits da operação forem 0. Vamos a um exemplo para facilitar a compreensão. Sejam as seguintes variáveis:
/* Exemplo com o operador or ( | ) */ int a, b; a = 30; // 0000.0000.0001.1110 em binário b = 19; // 0000.0000.0001.0011 c = a | b; // 0000.0000.0001.1111 = 31
A variável c possuirá o valor 31 em decimal. A princípio esse valor pode não fazer sentido, mas observe que é exatamente o resultado da operação or bit a bit entre as variáveis a e b.
Programa de teste:
/* Operação or entre as variáveis a e b */ int main( ){ int a, b, c; a = 30; b = 19; c = a | b; printf("%d & %d = %d\n", a, b, c); return 0; }
Perceba que o resultado é completamente diferente do operador ||. Ao fazer esta operação:
a = 30; // 0000.0000.0001.1110
b = 19; // 0000.0000.0001.0011
c = a || b; // 0000.0000.0000.0001 = 1
O resultado será 1 pois o operador || não faz a operação bit a bit, mas verifica qual valor é diferente de nulo, diferente de falso. Como na linguagem C zero é falso e tudo que for diferente de zero é verdadeiro, o resultado será 1, pois as variáveis ‘a’ e ‘b’ são verdadeiras (diferente de zero).
Mesmo se o valor de uma das variáveis for alterado para zero, assim:
a = 0; // 0000.0000.0000.0000
b = 19; // 0000.0000.0001.0011
c = a || b; // 0000.0000.0000.0001 = 1
O resultado ainda será 1, pois uma das variáveis, a variável ‘b’, ainda é verdadeira (diferente de zero).
Aplicações:
1) Como ativar um bit (colocar um bit em 1)
Imagine uma sequência de bits qualquer como: xxxx.xxxx
Como colocar o bit 4 em 1? O bit 4 é o quinto bit da direita para a esquerda.
Como desejamos setar apenas o bit 4, podemos criar uma máscara onde apenas o bit 4 seja 1 e realizar a operação | entre as duas sequências de bits, assim:
xxxx.xxxx
| 0001.0000
————-
xxx1.xxxx
Observe que com esta máscara, apenas o bit 4 é alterado, os demais mantêm o valor que já possuíam, zero ou um.
Programa de teste:
/* Setando um bit para 1 */ int main( ){ int a, b; a = 1; // 0000.0001 b = a | (1 << 1);// 0000.0011 = 3 printf("a: %d\tb: %d\n", a, b); b = a | (1 << 2);// 0000.0101 = 5 printf("a: %d\tb: %d\n", a, b); b = a | (1 << 3);// 0000.1001 = 9 printf("a: %d\tb: %d\n", a, b); return 0; }