Breno++ # Excelente explicação! Concordo com a opinião do Nelson de que deveria virar um artigo, mesmo porque não existe muito material bom em português sobre isso( eu pelo menos nunca vi um que prestasse, o seu é o primeiro ). Parabéns!<div>
<br></div><div><br></div><div>Cheersr!<br><br><div class="gmail_quote">Em 31 de maio de 2010 08:14, "Flávio R. Lopes" <span dir="ltr"><<a href="mailto:flavio.lopes@links.inf.br">flavio.lopes@links.inf.br</a>></span> escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Olá Breno!<br>
Cara!...isto foi uma aula!...Obrigado pela ótima explicação!<br>
Mas como você disse, isto ainda não é para mim!...Quem sabe algum dia em algum caso específico!<br>
<br>
Já até arquivei este e-mail!<br>
<br>
Abraço,<br>
Flávio<br>
<br>
Em 31-05-2010 04:08, breno escreveu:<div><div></div><div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2010/5/31 "Flávio R. Lopes"<<a href="mailto:flavio.lopes@links.inf.br" target="_blank">flavio.lopes@links.inf.br</a>>:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Boa noite pessoal.<br>
Ainda seguindo nos meus estudos, me deparei com um capítulo que trata dos<br>
"Bitwise Operators".<br>
Achei "meio complicado" !!!<br>
<br>
Parecem-se muito com os comparadores lógicos<br>
<br>
Enfim, ONDE isto é usado ou PARA QUE isto é usado?<br>
<br>
<br>
</blockquote>
Resposta curta: se vc realmente não tem idéia do que é ou pra que é<br>
usado, vc não precisa disso. Pule e seja feliz :-)<br>
<br>
É sério. Algumas linguagens de programação são minimalistas e voltadas<br>
para um tipo de problema específico. Perl 5 é uma linguagem complexa e<br>
de uso geral, o que significa que foi especialmente projetada para<br>
resolver uma série de problemas. Pense em Perl como uma lingua. Você<br>
sabe português, não sabe? O que é um "camote"? Ou um "extrário"?<br>
"Oligolécito"? Não sabe? Pois é, nem eu. E não precisei nem procurar<br>
muito: abri o dicionário aqui em 3 páginas aleatórias e elas estavam<br>
lá. Quando vi pensei "aaahhhhnnnn ok", e agora que estou escrevendo,<br>
já fiz questão de esquecê-las novamente. Não fazem parte do meu<br>
vocabulário pq não preciso delas. O dia que surgirem, peço licença,<br>
olho o "pai dos burros" e sigo em frente. Perl (e outras linguagens<br>
verborrágicas) são assim também. Um dia você olha um código chamando<br>
uma função que não conhece, e perldoc nela. Ou, se um dia tiver um<br>
problema qualquer, uma busca simples por palavras chaves (ou em listas<br>
como essas) te apontará para esse tipo de conhecimento e<br>
funções/módulos associados. Então, não perca tempo tentando saber<br>
tudo. Com tanta informação no mundo, precisamos escolher sabiamente<br>
com o que ocupar a mente ;-)<br>
<br>
Resposta longa: Como vc achou "meio complicado", vou começar a<br>
resposta do ONDE e PRA QUE com "O QUE". Operadores "bitwise", às vezes<br>
traduzidos como "bit-a-bit", servem pra fazer operações com bits.<br>
Enquanto operadores lógicos avaliam cada lado da operação apenas como<br>
verdadeiro ou falso, operações bit-a-bit geram um valor numérico entre<br>
os dois lados da operação.<br>
<br>
Em computadores, seus dados são armazenados em grandes coleções de<br>
zeros e uns, os bits. Números decimais, por exemplo, são representados<br>
em forma binária (base 2, números compostos apenas por bits):<br>
<br>
0 => 0<br>
1 => 1<br>
2 => 10<br>
3 => 11<br>
4 => 100<br>
5 => 101<br>
6 => 110<br>
7 => 111<br>
8 => 1000<br>
9 => 1001<br>
10 => 1010<br>
11 => 1011<br>
12 => 1100<br>
13 => 1101<br>
14 => 1110<br>
15 => 1111<br>
<br>
e assim por diante.<br>
<br>
As operações desse tipo são feitas bit-a-bit. Vejamos como exemplo a<br>
operação "E" (AND), que é 1 apenas se os dois bits avaliados forem 1,<br>
e 0 caso contrário. Assim, ao fazermos "3& 14", estamos calculando na<br>
verdade "0011& 1110" (veja tabela acima). Isso fará uma comparação<br>
(da esquerda pra direita) de 0 com 1 (resultando em 0), depois de 0<br>
com 1 novamente (0), depois de 1 com 1 (resultando em 1) e finalmente,<br>
de 1 com 0 (0). O valor final, portanto, será "0010", ou seja, "2" (na<br>
base decimal):<br>
<br>
0 0 1 1<br>
& 1 1 1 0<br>
--------------<br>
0 0 1 0<br>
<br>
As operações mais comuns entre dois valores são E (AND), OU (OR), e OU<br>
EXCLUSIVO (XOR), que podem ser representados pelas seguintes<br>
tabelas-verdade (observe cada linha para combinações de bits em $p e<br>
$q, e para o bit resultante da operação entre eles):<br>
<br>
E (AND)<br>
--------------------------<br>
$p , $q , $p& $q<br>
0 , 0 , 0<br>
0 , 1 , 0<br>
1 , 0 , 0<br>
1 , 1 , 1<br>
<br>
<br>
OU (OR)<br>
--------------------------<br>
$p , $q , $p | $q<br>
0 , 0 , 0<br>
0 , 1 , 1<br>
1 , 0 , 1<br>
1 , 1 , 1<br>
<br>
<br>
OU EXCLUSIVO (XOR)<br>
--------------------------<br>
$p , $q , $p ^ $q<br>
0 , 0 , 0<br>
0 , 1 , 1<br>
1 , 0 , 1<br>
1 , 1 , 0<br>
<br>
<br>
Há ainda o NÃO (NOT), que inverte todos os bits do elemento:<br>
<br>
$p ~$p<br>
0 1<br>
1 0<br>
<br>
<br>
Agora, de volta à sua pergunta original:<br>
<br>
Operações bit a bit são muito utilizadas na manipulação de dados<br>
binários (imagens, criptografia, etc) e quando espaço é um problema<br>
(como alguns sistemas embutidos ou operações em massa). Dois exemplos<br>
pra vc:<br>
<br>
1) Máscaras de rede são números de 32 bits usados pra separar a parte<br>
correspondente à rede pública, à subrede e aos hosts. Quando dizemos<br>
que uma subrede tem máscara 255.255.255.0, estamos fazendo uma<br>
operação binária AND entre esse valor<br>
(11111111.11111111.11111111.00000000) e o valor da rede, também em<br>
binário.<br>
<br>
2) Quando temos valores que podem ser apenas verdadeiro ou falso<br>
(também chamados de flags), podemos otimizar o espaço ocupado<br>
atribuindo um bit para cada flag. Por exemplo:<br>
<br>
POSSUI_FOO = 0001<br>
POSSUI_BAR = 0010<br>
POSSUI_BAZ = 0100<br>
POSSUI_MEH = 1000<br>
<br>
Assim, não nos importamos com o valor decimal resultante mas sim com<br>
quais flags estão ativas. O valor 1001, por exemplo, possui apenas as<br>
flags "FOO" e "MEH" ativas. Note que, conforme nossa representação<br>
binário-decimal, cada bit ativo pode ser representado por uma potência<br>
de 2:<br>
<br>
0001 == 1 == 2**0<br>
0010 == 2 == 2**1<br>
0100 == 4 == 2**2<br>
1000 == 8 == 2**3<br>
<br>
etc.<br>
<br>
Uma rápida olhada em nossas tabelas verdade e vemos que podemos<br>
atribuir flags através de OR:<br>
<br>
my $flags = 0;<br>
my ($IS_FOO, $IS_BAR, $IS_BAZ, $IS_MEH) = (1, 2, 4, 8);<br>
<br>
$flags = $flags | $IS_FOO; # ativa a flag 'FOO'<br>
$flags = $flags | $IS_BAZ; # ativa a flag 'BAZ'<br>
<br>
e testar cada flag através de um AND:<br>
<br>
# flag 'FOO' está ativa?<br>
if ( $flags& $IS_FOO ) {<br>
...<br>
}<br>
<br>
Pacotes IPv4 e outras estruturas de dados que precisam de otimização<br>
de espaço usam isso, já que dessa forma não precisam reservar um (ou<br>
mais) bytes para cada flag.<br>
<br>
Esse tipo de cenário pode ser encontrado até fora de ambientes<br>
computacionais, como uma prova de concurso com N afirmativas valendo<br>
1, 2, 4, 8, 16, 32 e que pede ao aluno pra dizer a soma das<br>
afirmativas corretas (OR).<br>
<br>
<br>
É isso. Mas não se acostume, esse é o tipo de pergunta cuja resposta<br>
pode ser facilmente encontrada aqui:<br>
<br>
<a href="http://tinyurl.com/2aggysf" target="_blank">http://tinyurl.com/2aggysf</a><br>
<br>
<br>
[]s<br>
<br>
-b<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
<br>
</blockquote>
<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br>(11)82907780<br>
</div>