Esse artigo, tem como objetivo uma explicação didática e simples do que são bitwise operations, e, para tornar o assunto um pouco mais prático, utilizo alguns exemplos em linguagem C (Sim, os códigos são livres e voce pode copiá-los para onde quiser
.
Para um melhor entendimento, dividi o artigo em duas partes (dois posts), sendo a primeira uma parte introdutória a manipulação de números binários utilizando bits e bytes, e a segunda parte sobre bitwise em si.
– Manipulação de números binários com bits e bytes –
Todas as operaçõs de um computador são baseadas na unidade binária, ou seja zero ou um. Para representar estas unidades, são utilizados bits, onde cada bit possui apenas dois estados: ligado ou desligado, 1 ou 0.
Dependendo da informação a ser armazenada, apenas estes dois estados não são suficientes, então, utilizamos “conjuntos” de bits para podermos representar estas informações.
Como um exemplo podemos pensar no armazenamento de números decimais:
Binário | Decimal
0 | 0
1 | 1
10 | 2
11 | 3
100 | 4
Como podemos ver, para representar os numeros decimais (base 10) 1 ou 0, é necessário apenas um bit, porém, conforme o valor decimal é incrementado, somente estes dois bits não são suficientes, havendo então a necessidade de adicionarmos mais bits a um número para podermos representar valores maiores.
A solução então, é sempre a mesma. Vamos juntar bits até conseguir representar os valores necessários
Como exemplo, podemos também utilizar bits para representar o estado civil de uma pessoa, ou seja 4 estados possíveis:
00 – Solteiro
01 – Casado
10 – Divorciado
11 – Viuvo
Agora, voltando a representação em bits de numeros decimais, o que acontece se for necessário efetuar a soma de um número de 5 bits com um numero de 12 bits ?
Para efetuar tais operações, foi definida uma unidade chamada byte, sendo atribuido 8 bits a esta unidade.
A partir daí, as informações passaram a ser agrupadas e representadas por estes conjuntos. Então, se formos representar novamente os números decimais dentro de um byte, nós teríamos:
Binário | Decimal
00000000 | 0
00000001 | 1
00000010 | 2
00000011 | 3
00000100 | 4
Notem que agora, todos os valores obrigatoriamente possuem 8 bits.
O que acontece então, quando 8 bits não são mais suficientes ? Simples, adicione mais um byte
Agora, já podemos efetuar a soma de um número com 5 bits e um número com 12 bits:
Vamos então utilizar como exemplo, a soma dos números:
19 = 10011 (5bits)
3142 = 110001000110 ( 12 bits)
Como os números acima não possuem a quantidade de bits necessárias para preencher um byte, os bits restantes serão preenchidos com zero. então temos:
19 = 00010011 ( 1 byte )
3142 = 00001100 01000110 ( 2 bytes )
Para efetuar a soma, podemos então utilizar a mesma regra que é utilizada para números decimais, como exemplo, 9 + 1 = 0 e vai um
lembrando apenas que neste caso estamos utilizando base dois, o que significa entao: 1 + 1 = 0 e vai um
19 = 00000000 00010011
3142 = 00001100 01000110
3161 = 00001100 01011001
Tentem reparar no método como é efetuada a soma ( 1 + 1 = 0 e vai um ).
Não vou abordar nesse artigo a conversão binária -> decimal e vice-versa, mas uma boa técnica para efetuar isso, é utilizando uma tabela como abaixo:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
————————————
0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
Para utilizar a tabela, vamos pegar como exemplo o número 19 : 00010011
Colocamos ele na tabela, como acima.
Vamos então pegar todos os bits que estão ligados: 16, 2 e 1 e somá-los…
16 + 2 + 1 = 19
Não é maravilhoso ? =D
Prestem atenção, da direita para esquerda, há uma multiplicação por 2 entre os campos: 1 * 2 = 2, 2 * 2 = 4, etc..
Então, o que fazer se tivermos um número com 9 bits ? multiplique o último campo (128) por 2, e adicione o 9º bit (256).
Reparem também, que se enumerarmos cada bit da direita para a esquerda (0, 1 ,2, 3, 4, 5, 6, 7), descobrimos que o numero do bit é o expoente que deve ser utilizado a base 2. ou seja, se pegarmos o sétimo bit (128) e efetuarmos 2^7, teremos o valor do campo (128).

