Operadores Bitwise
OPERADORES BITWISE
Operadores bitwise são usados quando precisamos fazer operações a nível de bits. Funcionam de forma semelhante aos operadores lógicos, exceto por trabalharem com representação binária de dados. A combinação de ponteiros, juntamente com os operadores a nível de bit fazem do C uma linguagem de programação completamente usável para aplicações de baixo nível, substituindo o código assembly. Para se ter uma idéia, apenas 10% (aproximadamente) do código do linux é feito em código assembly, o resto é C.
Os seguintes operadores são disponíveis:
- val1 & val2 : operador AND, compara 2 bits, se os dois tiverem o valor 1, retorna 1, senão retorna 0.
- Ex: val1 & val2
- 0011 : val1
- 1011 : val2
- 0011: Res
- Ex: val1 & val2
- val1 | val2 : operador OR, compara 2 bits, caso um deles possua o valor 1, retorna 1, caso contrário 0.
- Ex: val1 | val2
- 0011 : val1
- 1011 : val2
- 1011 : Res
- Ex: val1 | val2
- val1 ^ val2 : operador XOR, compara 2 bits, caso os dois tiverem o mesmo valor, retorna 0, caso contrário retorna 1.
- Ex: val1 ^val2
- 0011 : val1
- 1011 : val2
- 1000 : Res
- Ex: val1 ^val2
- ~val1 : operador COMPLEMENT, inverte todos os bits. Operador unário, isto é, opera sobre apenas um operador. Pelos bits 1 substitui-se por 0 e vice versa.
- Ex: ~0011 : 1100
- val1 >> val2 : operador DESLOCAMENTO À DIREITA, move os bits à direita, descartando os valores mais à direita, e acrescentando 0, à esquerda.
- Ex: val1 >> val2
- 0101 : val1
- 2 : val2
- 0001 : Res
- Ex: val1 >> val2
- val1 << val2 : operador DESLOCAMENTO À ESQUERDA, move os bits à esquerda, descartando os valores mais à esquerda, e acrescentando 0, à direita.
- Ex: val1 << val2
- 0101 : val1
- 2 : val2
- 0100 : Res
- Ex: val1 << val2
Obs: Ambos os operadores relacionados com bitwise devem ser valores inteiros.
Não confuda “&” (“and” bitwise) com “&&” (“and” lógico). Bem como “|” com “||”.
Operadores bitwise são utilizados para modificar bits individualmente sobre um operando. Um único byte de computador armazena 8 bits, os quais podem significar true/false de 8 flags, onde cada bit pode ser usado como uma variável booleana. Então, se em um programa for necessário armazenar várias flags, estas podem ser setadas em um único byte, onde cada bit representa o status de true/false.