Bitwise - Escovando os bits
Bitwise é uma técnica que consiste, basicamente, em alterar a sequência de bits de uma variável. Nesse artigo, pretendo mostrar como trabalhar com os principais operadores Bitwise na linguagem C.
Os operadores
Hoje vou mostrar como trabalhar com operadores de bits em C. Essa técnica é conhecida como Bitwise (e também como "escovar bits"). Trata-se, basicamente, de usar alguns operadores para alterar a sequência de bits de uma variável.
Em C, cada variável tem um tipo e cada um desses tipos têm um tamanho diferente (quantidade de bits). Por exemplo, uma variável do tipo "char" tem o tamanho de 8 bits (o que equivale a 1 byte) e uma variável do tipo "int" geralmente tem 32 bits (4 bytes).
Os principais operadores Bitwise, são:
Esses operadores funcionam da seguinte maneira:
Em C, cada variável tem um tipo e cada um desses tipos têm um tamanho diferente (quantidade de bits). Por exemplo, uma variável do tipo "char" tem o tamanho de 8 bits (o que equivale a 1 byte) e uma variável do tipo "int" geralmente tem 32 bits (4 bytes).
Os principais operadores Bitwise, são:
- Operador & (and)
- Operador | (or)
- Operador ^ (xor)
- Operador ~ (not)
- Operador >> (right shift)
- Operador << (left shift)
Esses operadores funcionam da seguinte maneira:
& (and)
O operador & compara os bits de cada variável um por um, quando os dois bits (um da variável "a" e outro da variável "b") são iguais a 1 (bit ligado), o retorno é 1. Caso contrário, o retorno é 0.char a = 1; // 0000 0001 char b = 5; // 0000 0101 char c = a & b; // 0000 0001
| (or)
O operador | também compara os bits de cada variável um por um, quando pelo menos um dos bits é igual a 1, o retorno é 1. Caso contrário, o retorno é 0.char a = 1; // 0000 0001 char b = 5; // 0000 0101 char c = a | b; // 0000 0101
^ (xor)
O operador ^ compara os bits de forma que, se os 2 bits (um da variável "a" e outro da variável "b") forem iguais ele, retorna 0. Caso contrário, ele retorna 1.char a = 1; // 0000 0001 char b = 5; // 0000 0101 char c = a ^ b; // 0000 0100
~ (not)
O operador ~ inverte os bits de uma variável, onde era 1 fica 0 e onde era 0, fica 1.char a = 1; // 0000 0001 char b = ~a; // 1111 1110
<< (left shift) e >> (right shift)
Os operadores << e >> fazem o deslocamentos dos bits para direita e para a esquerda. Preenchendo o restante com 0.char a = 1; // 0000 0001 char b = a << 2; // 0000 0100 char c = b >> 2; // 0000 0001