+2

Esmiuçando operadores bit-a-bit

criado por Alisson Carlos de F. Rodrigues em 24/12/2006 9:53pm
Fala galera! Provavelmente poucos aqui devem ter ouvido falar sobre operadores bit a bit, e dos que ouviram falar, poucos os conhecem a fundo e sabem trabalhar com eles. Então vou tentar explicar de uma forma simples e prática como essa “coisa” funciona.

Pois bem, primeiramente, tem esse nome “operadores bit a bit”, pois lidam literalmente com cada bit separadamente, aquele monte de 0 e 1 que são as linguagens de máquina.

Pra tentar explicar meio assim por cima, imagine que tenhamos 4 setinhas (direita, esquerda, cima, baixo), supomos que estamos dentro de um jogo. E ao pressionar qualquer uma dessas teclas é produzido um determinado número (números diferentes para cada uma). Podemos fazer o seguinte esquema: direita (1), esquerda (2), cima (4), baixo (8). Depois explico o porquê desses números.

Ok, então temos 4 ações, que é pressionar cada uma dessas teclas. Mas obviamente, em um jogo você não vai andar apenas em 4 direções, portanto podemos ter combinações dessas teclas, e pra cada uma dessas combinações, podemos adotar novos números. direita+cima (5), esquerda+cima (6), direita+baixo (9), esquerda+baixo (10). Ainda podemos ter outras combinações, com 3 teclas ou em um caso 4, mas não tratarei disso.

Você provavelmente deve estar se perguntando: “Tio Alissooooooooon, mas por que esses números? Por que você não usou 3 e 7?”. Calma meu querido, já vou explicar.

Você deve saber que TUDO em uma computador é transformado em binário, aquelas infinitas combinações de 0 e 1. Vamos então transformar esses números acima em binários:

01: 1
02: 10
04: 100
05: 101
06: 110
08: 1000
09: 1001
10: 1010

Reparem naqueles primeiros números, das teclas individuais: 1, 10, 100, 1000. Se você pensou “são potências de 10” você acertou. Mas por que isso? Simplesmente porque eles possuem apenas um número “1” e com posições diferentes entre eles, pra visualizar melhor, observe:

0001
0010
0100
1000

Se o querido amigo é inteligente, já deve ter percebido que para cada uma das teclas, apenas um bit fica responsável, CHARAM. Simples assim, se a tecla está pressionada, o tal bit tem o número “1”, caso contrário tem o número “0”. Portanto, da direita pra esquerda, o primeiro bit é a tecla direita, o segundo a esquerda, o terceiro pra cima e o quarto...baixo. Quando pressionamos duas teclas, simplesmente aparece dois números “1”. Por exemplo, esquerda (10) + cima (100) = 110 = 6. Gostou? Pois é, se quiser testar os outros números (se usar windows), abra a calculadora do windows e coloque no modo cientifico, aperte o radio button “Bin” e digite o número binário e depois pressione o radio button “Dec”. Irá aparecer o número em decimal.

Agora supondo que pressionemos as teclas direita+esquerda+cima, o que aconteceria? Isso mesmo, formaria o número 111, que é...? 7, lembra dele amigo? E se pressionarmos esquerda+direita? Isso, 3. Entende agora porque não os usamos? Pois é, infelizmente você não pode andar para a direita e para a esquerda ao mesmo tempo.

Então, como podemos saber se determinada tecla foi ou não pressionada? Não, nada de substr, nem coisas horríveis como:

if ($numeroRetornado==1 || $numeroRetornado==5 || $numeroRetornado==9) {...

...deixa de ser preguiçoso, vamos usar Operadores bit-a-bit. Apresento-lhe eles agora (tirado do manual):

$a & $b – Os bits que estão ativos tanto em $a como $b são ativados
$a | $b – Os bits que estão ativos em $a ou em $b são ativados.
$a ^ $b – Os bits que estão ativos em $a ou em $b, mas não em ambos, são ativados.
~ $a – Os bits que estão ativos em $a não são ativados, e vice-versa

Em nosso caso usaremos o “&”, que serve, como dito acima, para ativar apenas o que estiver nas duas variáveis dadas. De uma forma mais simples, a posição que tiver o número 1 nas duas variáveis serão ativados, caso contrário será “0” o resultado. Por exemplo, você tem dois números:



Repare na ligação que existe entre os dois números, no caso do “&”, onde tiver dois números “1” será colocado “1”, caso contrário será colocado “0”.

Agora, vamos analisar nosso primeiro sistema. Nós queremos saber se a tecla da direita está pressionada, para isso, faremos a comparação do número retornado (101=5) com o número dessa tecla, que no caso é “1” (em binário é 1 mesmo):



No resultado temos o número da tecla pressionada. Pronto, podemos fazer isso com as outras teclas também, basta você pegar o valor retornado e comparar com o valor padrão de cada tecla, se chegar a esse mesmo resultado é porque tal tecla foi pressionada.

Agora você me pergunta: como fazer isso em PHP? Simples, nesse último caso você faria:

$direita = 1 & 5;
Simples não? Pois é, $direita vai conter o valor 1. Naquele primeiro caso, dos valores 236 e 125, se você fizesse:

$direita = 236 & 125;
$direita conteria o valor 108. Então para verificar se foi pressionada a tal tecla, basta fazer:

if ($numeroRetornado & $numeroDaTecla == $numeroDaTecla)
print “Está pressionada”;
else print “Não está pressionada”;

Deixo a oportunidade pra vocês fazerem os testes sozinhos.

O operador “&”, portanto, serve para retornar o número 1 quando presente nos dois números dados.
O operador “|” serve para retornar o número 1 quando este estiver presente em qualquer um dos dois números dados.
O operador “^” serve para retornar o número 1 quando este estiver presente em apenas um dos dois números dados.
O operador “~” serve para inverter os valores dados, ou seja, onde for 1 será retornar 0 e onde for 0 será retornado 1.

Comentários:

Mostrando 1 - 10 de 11 comentários
Gustavo disse:
O artigo é bem interessante. Curioso que, talvez pela característica de praticidade do php, poucos façam uso desse recurso.

Apenas para colaborar, é necessário observar a precedência dos operadores do exemplo:
if ($numeroRetornado & $numeroDaTecla == $numeroDaTecla)

O correto deveria ser:
if (($numeroRetornado & $numeroDaTecla) == $numeroDaTecla)

Isso porque '==' tem precedência maior que '&', logo se os valores de $numeroRetornado e $numeroDaTecla forem iguais entre si e diferentes de '1', o resultado será erradamente falso.

[]'s
06/05/2007 1:29pm (~9 anos atrás)

Muito bom, interessante as operações bit-a-bit, dão um ganho considerável de desempenho.É "estranho" utilizar esses operadores, mas creio que é uma questão de costume.

Meus parabéns
09/03/2007 4:15am (~9 anos atrás)

Já terminei a segunda parte do artigo e já enviei pro site, só falta os moderadores aceitarem.
06/03/2007 12:39pm (~9 anos atrás)

Talvez eu crie um segundo artigo ainda com alguns exemplos úteis e até alguns exercícios. t+
06/03/2007 5:47am (~9 anos atrás)

Foi bom cara...
Agora só preciso achar um modo de usar esses operadores.
Pois só fixo bem quando eu começo a fazer...
05/03/2007 10:40pm (~9 anos atrás)

Aqui na empresa usamos isso direto. E seu artigo foi fundamental para meu embasamento... !!
28/02/2007 10:38am (~9 anos atrás)

Pois é meu velho, respirando novos ares hehehe
26/01/2007 6:03pm (~10 anos atrás)

hinom disse:
olha quem tah aqui! alisson do imasters
25/01/2007 8:58pm (~10 anos atrás)

Bom Artigo!
Show de bola operadores bit a bit.
11/01/2007 8:51am (~10 anos atrás)

Bom artigo!
Isso tambem é materia para quem quer se certificar!
Valew!
09/01/2007 3:39am (~10 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)