Esmiuçando operadores bit-a-bit
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:
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:
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:
...deixa de ser preguiçoso, vamos usar Operadores bit-a-bit. Apresento-lhe eles agora (tirado do manual):
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:
Simples não? Pois é, $direita vai conter o valor 1. Naquele primeiro caso, dos valores 236 e 125, se você fizesse:
$direita conteria o valor 108. Então para verificar se foi pressionada a tal tecla, basta fazer:
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.
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;
$direita = 236 & 125;
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.
Páginas:
1
2
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
Meus parabéns
09/03/2007 4:15am
(~17 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
(~17 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
(~17 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...
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
(~17 anos atrás)
Aqui na empresa usamos isso direto. E seu artigo foi fundamental para meu embasamento... !!
28/02/2007 10:38am
(~18 anos atrás)
Bom artigo!
Isso tambem é materia para quem quer se certificar!
Valew!
Isso tambem é materia para quem quer se certificar!
Valew!
09/01/2007 3:39am
(~18 anos atrás)
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