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, &quot;Flávio R. Lopes&quot; <span dir="ltr">&lt;<a href="mailto:flavio.lopes@links.inf.br">flavio.lopes@links.inf.br</a>&gt;</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 &quot;Flávio R. Lopes&quot;&lt;<a href="mailto:flavio.lopes@links.inf.br" target="_blank">flavio.lopes@links.inf.br</a>&gt;:<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>
&quot;Bitwise Operators&quot;.<br>
Achei &quot;meio complicado&quot; !!!<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 &quot;camote&quot;? Ou um &quot;extrário&quot;?<br>
&quot;Oligolécito&quot;? 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 &quot;aaahhhhnnnn ok&quot;, 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 &quot;pai dos burros&quot; 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 &quot;meio complicado&quot;, vou começar a<br>
resposta do ONDE e PRA QUE com &quot;O QUE&quot;. Operadores &quot;bitwise&quot;, às vezes<br>
traduzidos como &quot;bit-a-bit&quot;, 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 =&gt;          0<br>
1 =&gt;          1<br>
2 =&gt;        10<br>
3 =&gt;        11<br>
4 =&gt;      100<br>
5 =&gt;      101<br>
6 =&gt;      110<br>
7 =&gt;      111<br>
8 =&gt;    1000<br>
9 =&gt;    1001<br>
10 =&gt;  1010<br>
11 =&gt;  1011<br>
12 =&gt;  1100<br>
13 =&gt;  1101<br>
14 =&gt;  1110<br>
15 =&gt;  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 &quot;E&quot; (AND), que é 1 apenas se os dois bits avaliados forem 1,<br>
e 0 caso contrário. Assim, ao fazermos &quot;3&amp;  14&quot;, estamos calculando na<br>
verdade &quot;0011&amp;  1110&quot; (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á &quot;0010&quot;, ou seja, &quot;2&quot; (na<br>
base decimal):<br>
<br>
    0 0 1 1<br>
&amp;  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&amp;  $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 &quot;FOO&quot; e &quot;MEH&quot; 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 &#39;FOO&#39;<br>
$flags = $flags | $IS_BAZ;   # ativa a flag &#39;BAZ&#39;<br>
<br>
e testar cada flag através de um AND:<br>
<br>
# flag &#39;FOO&#39; está ativa?<br>
if ( $flags&amp;  $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>