<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'language.operators.bitwise.php',
    1 => 'Bin&aacute;rios',
    2 => 'Operadores Bin&aacute;rios',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => 'Operadores',
  ),
  'prev' => 
  array (
    0 => 'language.operators.assignment.php',
    1 => 'Atribui&ccedil;&atilde;o',
  ),
  'next' => 
  array (
    0 => 'language.operators.comparison.php',
    1 => 'Compara&ccedil;&atilde;o',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'language/operators/bitwise.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.bitwise" class="sect1">
 <h2 class="title">Operadores Binários</h2>
 
 <p class="simpara">
  Operadores binários permitem a avaliação e modificação de bits
  específicos em um tipo inteiro.
 </p>
 <table class="doctable table">
  <caption><strong>Operadores binários</strong></caption>
  
   <thead>
    <tr>
     <th>Exemplo</th>
     <th>Nome</th>
     <th>Resultado</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td><strong class="userinput"><code>$a &amp; $b</code></strong></td>
     <td>E (AND)</td>
     <td>Os bits que estão ativos tanto em <var class="varname">$a</var> quanto em <var class="varname">$b</var> são ativados.</td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a | $b</code></strong></td>
     <td>OU (OR inclusivo)</td>
     <td>Os bits que estão ativos em <var class="varname">$a</var> ou em <var class="varname">$b</var> são ativados.</td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a ^ $b</code></strong></td>
     <td>XOR (OR exclusivo)</td>
     <td>
      Os bits que estão ativos em <var class="varname">$a</var> ou em <var class="varname">$b</var>, mas não em ambos, são ativados.
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>~ $a</code></strong></td>
     <td>NÃO (NOT)</td>
     <td>
      Os bits que estão ativos em <var class="varname">$a</var> não são ativados, e vice-versa.
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a &lt;&lt; $b</code></strong></td>
     <td>Deslocamento à esquerda</td>
     <td>
      Desloca os bits de <var class="varname">$a</var> em <var class="varname">$b</var> passos para a esquerda (cada passo significa
      &quot;multiplica por dois&quot;)
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a &gt;&gt; $b</code></strong></td>
     <td>Deslocamento à direita</td>
     <td>
      Desloca os bits de <var class="varname">$a</var> em <var class="varname">$b</var> passos para a direita (cada passo significa
      &quot;divide por dois&quot;)
     </td>
    </tr>

   </tbody>
  
 </table>

 <p class="para">
  O deslocamento de bits no PHP é aritmético.
  Bits deslocados no lado final são descartados.
  Deslocamentos à esquerda tem zeros inseridos à direita e o bit
  de sinal é perdido, e assim o sinal do operando
  não é preservado.
  Deslocamentos à direita têm cópias do bit de sinal à esquerda,
  e assim o sinal do operando é preservado.
 </p>
 <p class="para">
  Utilize parênteses para garantir a
  <a href="language.operators.precedence.php" class="link">precedência</a> desejada.
  Por exemplo <code class="literal">$a &amp; $b == true</code> avalia primeiro
  a equivalência e depois a operação de bits, enquanto que
  <code class="literal">($a &amp; $b) == true</code> avalia primeiro a operação de bits e
  só depois a equivalência.
 </p>
 <p class="para">
  Se ambos os operandos de <code class="literal">&amp;</code>, <code class="literal">|</code> e
  <code class="literal">^</code> forem strings então a operação será
  realizada nos valores ASCII dos caracteres das strings, e o
  resultado final será uma string. Em todos os outros casos ambos os operandos serão
  <a href="language.types.integer.php#language.types.integer.casting" class="link">convertidos para inteiros</a>
  e o resultado será um inteiro.
 </p>
 <p class="para">
  Se o operando de <code class="literal">~</code> for uma string então a
  operação será realizada nos valores ASCII dos caracteres da
  string, e o resultado será uma string. Nos demais casos o operando e o
  resultado serão tratados como inteiros.
 </p>
 <p class="para">
  Ambos os operandos e o resultado para <code class="literal">&lt;&lt;</code> e
  <code class="literal">&gt;&gt;</code> sempre são tratados como inteiros.
 </p>
 <p class="para">
  A configuração error_reporting ini utiliza valores posicionados em bits,
  fornecendo um exemplo real de ligar ou desligar
  bits. Para mostrar todos os erros mas não os alertas
  coloque no php.ini:
  <strong class="userinput"><code>E_ALL &amp; ~E_NOTICE</code></strong>
 </p>
 <p class="para">
  <div class="informalexample">
   <p class="para">
    <pre class="literallayout">
     Isto funciona pois começa com E_ALL:
     <span class="computeroutput">00000000000000000111011111111111</span>
     Depois pegando o valor de E_NOTICE...
     <span class="computeroutput">00000000000000000000000000001000</span>
     ... que invertido através de <code class="literal">~</code>:
     <span class="computeroutput">11111111111111111111111111110111</span>
     ... é finalmente mesclado via E (&amp;) e assim o valor final
     se torna:
     <span class="computeroutput">00000000000000000111011111110111</span>
    </pre>
   </p>
  </div>
 </p>
 <p class="para">
  Outra forma de conseguir esse efeito seria através do XOR (<code class="literal">^</code>)
  para encontrar os bits que estão ativos em apenas um ou no outro:
  <strong class="userinput"><code>E_ALL ^ E_NOTICE</code></strong>
 </p>
 <p class="para">
  O error_reporting pode também ser utilizado para demonstrar a ativação de bits.
  Para mostrar apenas erros e erros recuperáveis:
  <strong class="userinput"><code>E_ERROR | E_RECOVERABLE_ERROR</code></strong>
 </p>
 <p class="para">
  <div class="informalexample">
   <p class="para">
    <pre class="literallayout">
     Este processo combina E_ERROR
     <span class="computeroutput">00000000000000000000000000000001</span>
     e
     <span class="computeroutput">00000000000000000001000000000000</span>
     utilizando OU (<code class="literal">|</code>)
     para pegar os bits ativos de ambos os valores:
     <span class="computeroutput">00000000000000000001000000000001</span>
    </pre>
   </p>
  </div>
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Exemplo #1 Operações bitwise AND, OR e XOR em inteiros</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/*<br /> * Ignore essa primeira parte,<br /> * que é apenas para deixar a impressão mais limpa.<br /> */<br /><br /></span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'(%1$2d = %1$04b) = (%2$2d = %2$04b)'<br />        </span><span style="color: #007700">. </span><span style="color: #DD0000">' %3$s (%4$2d = %4$04b)' </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;EOH<br /></span><span style="color: #DD0000"> ---------     ---------  -- ---------<br /> resultado     valor      op teste<br /> ---------     ---------  -- ---------<br /></span><span style="color: #007700">EOH;<br /><br /><br /></span><span style="color: #FF8000">/*<br /> * Agora os exemplos<br /> */<br /><br /></span><span style="color: #0000BB">$values </span><span style="color: #007700">= array(</span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">8</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$test </span><span style="color: #007700">= </span><span style="color: #0000BB">1 </span><span style="color: #007700">+ </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"\n Operador de bit E \n"</span><span style="color: #007700">;<br />foreach (</span><span style="color: #0000BB">$values </span><span style="color: #007700">as </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$value </span><span style="color: #007700">&amp; </span><span style="color: #0000BB">$test</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">$value</span><span style="color: #007700">, </span><span style="color: #DD0000">'&amp;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$test</span><span style="color: #007700">);<br />}<br /><br />echo </span><span style="color: #DD0000">"\n Operador de bit OU inclusivo \n"</span><span style="color: #007700">;<br />foreach (</span><span style="color: #0000BB">$values </span><span style="color: #007700">as </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$value </span><span style="color: #007700">| </span><span style="color: #0000BB">$test</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">$value</span><span style="color: #007700">, </span><span style="color: #DD0000">'|'</span><span style="color: #007700">, </span><span style="color: #0000BB">$test</span><span style="color: #007700">);<br />}<br /><br />echo </span><span style="color: #DD0000">"\n Operador de bit OU Exclusivo (XOR) \n"</span><span style="color: #007700">;<br />foreach (</span><span style="color: #0000BB">$values </span><span style="color: #007700">as </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$value </span><span style="color: #007700">^ </span><span style="color: #0000BB">$test</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">$value</span><span style="color: #007700">, </span><span style="color: #DD0000">'^'</span><span style="color: #007700">, </span><span style="color: #0000BB">$test</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>O exemplo acima produzirá:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
 ---------     ---------  -- ---------
 resultado     valor      op teste
 ---------     ---------  -- ---------
 Operador de bit E
( 0 = 0000) = ( 0 = 0000) &amp; ( 5 = 0101)
( 1 = 0001) = ( 1 = 0001) &amp; ( 5 = 0101)
( 0 = 0000) = ( 2 = 0010) &amp; ( 5 = 0101)
( 4 = 0100) = ( 4 = 0100) &amp; ( 5 = 0101)
( 0 = 0000) = ( 8 = 1000) &amp; ( 5 = 0101)

 Operador de bit OU inclusivo
( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101)
( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101)
( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) | ( 5 = 0101)

 Operador de bit OU exclusivo (XOR)
( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101)
( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101)
( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
</pre></div>
   </div>
  </div>
 </p>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>Exemplo #2 Operações de bit XOR em strings</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">12 </span><span style="color: #007700">^ </span><span style="color: #0000BB">9</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">// Exibe '5'<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"12" </span><span style="color: #007700">^ </span><span style="color: #DD0000">"9"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">// Exibe caractere backspace (ASCII 8)<br />                          // ('1' (ASCII 49)) ^ ('9' (ASCII 57)) = #8<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"hallo" </span><span style="color: #007700">^ </span><span style="color: #DD0000">"hello"</span><span style="color: #007700">;, </span><span style="color: #0000BB">PHP_EOL </span><span style="color: #FF8000">// Exibe os valores ASCII #0 #4 #0 #0 #0<br />                                 // 'a' ^ 'e' = #4<br /><br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2 </span><span style="color: #007700">^ </span><span style="color: #DD0000">"3"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">// Exibe 1<br />                       // 2 ^ ((int) "3") == 1<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"2" </span><span style="color: #007700">^ </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">// Exibe 1<br />                       // ((int) "2") ^ 3 == 1<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  <div class="example" id="example-3">
   <p><strong>Exemplo #3 Deslocamento de bits em inteiros</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/*<br /> * Aqui estão os exemplos.<br /> */<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"\n--- MOVENDO BITS A DIREITA EM INTEIROS POSITIVOS ---\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'cópia do bit de sinal trocada para a esquerda'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'move os bits para fora da direita'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'mesmo resultado que acima; não se pode mover além do 0'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- MOVENDO BITS A DIREITA EM INTEIROS NEGATIVOS ---\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= -</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'cópia do bit de sinal trocada para a esquerda'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= -</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'move os bits para fora da direita'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= -</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt;&gt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&gt;&gt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'mesmo resultado que acima; não se pode mover além do -1'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- MOVENDO BITS A ESQUERDA EM INTEIROS POSITIVOS ---\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'preenche com zeros o lado direito'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= (</span><span style="color: #0000BB">PHP_INT_SIZE </span><span style="color: #007700">* </span><span style="color: #0000BB">8</span><span style="color: #007700">) - </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= (</span><span style="color: #0000BB">PHP_INT_SIZE </span><span style="color: #007700">* </span><span style="color: #0000BB">8</span><span style="color: #007700">) - </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'bit de sinal movido para fora'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= (</span><span style="color: #0000BB">PHP_INT_SIZE </span><span style="color: #007700">* </span><span style="color: #0000BB">8</span><span style="color: #007700">) - </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'bits movidos para fora da esquerda'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- MOVENDO BITS A ESQUERDA EM INTEIROS NEGATIVOS ---\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= -</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'preenche com zeros o lado direito'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= -</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= (</span><span style="color: #0000BB">PHP_INT_SIZE </span><span style="color: #007700">* </span><span style="color: #0000BB">8</span><span style="color: #007700">) - </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$val </span><span style="color: #007700">= -</span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$places </span><span style="color: #007700">= (</span><span style="color: #0000BB">PHP_INT_SIZE </span><span style="color: #007700">* </span><span style="color: #0000BB">8</span><span style="color: #007700">) - </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt;&lt; </span><span style="color: #0000BB">$places</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #DD0000">'&lt;&lt;'</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #DD0000">'bits movidos para fora pela esquerda, incluindo o bit de sinal'</span><span style="color: #007700">);<br /><br /><br /></span><span style="color: #FF8000">/*<br /> * Ignore essa seção abaixo,<br /> * é apenas para formatar a saída e deixar mais clara a apresentação.<br /> */<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">p</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">$op</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">, </span><span style="color: #0000BB">$note </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'%0' </span><span style="color: #007700">. (</span><span style="color: #0000BB">PHP_INT_SIZE </span><span style="color: #007700">* </span><span style="color: #0000BB">8</span><span style="color: #007700">) . </span><span style="color: #DD0000">"b\n"</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Expressão: %d = %d %s %d\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$res</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">$op</span><span style="color: #007700">, </span><span style="color: #0000BB">$places</span><span style="color: #007700">);<br /><br />    echo </span><span style="color: #DD0000">" Decimal:\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"  val=%d\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"  res=%d\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$res</span><span style="color: #007700">);<br /><br />    echo </span><span style="color: #DD0000">" Binário:\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">'  val=' </span><span style="color: #007700">. </span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">'  res=' </span><span style="color: #007700">. </span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #0000BB">$res</span><span style="color: #007700">);<br /><br />    if (</span><span style="color: #0000BB">$note</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">" NOTA: </span><span style="color: #0000BB">$note</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />    }<br /><br />    echo </span><span style="color: #DD0000">"\n\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Saída do exemplo acima em máquinas de 32 bits:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>

--- MOVENDO BITS A DIREITA EM INTEIROS POSITIVOS ---
Expressão: 2 = 4 &gt;&gt; 1
 Decimal:
  val=4
  res=2
 Binário:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000010
 NOTA: cópia do bit de sinal trocada para a esquerda

Expressão: 1 = 4 &gt;&gt; 2
 Decimal:
  val=4
  res=1
 Binário:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000001

Expressão: 0 = 4 &gt;&gt; 3
 Decimal:
  val=4
  res=0
 Binário:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTA: move os bits para fora da direita

Expressão: 0 = 4 &gt;&gt; 4
 Decimal:
  val=4
  res=0
 Binário:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTA: mesmo resultado que acima; não se pode mover além do 0


--- MOVENDO BITS A DIREITA EM INTEIROS NEGATIVOS ---
Expressão: -2 = -4 &gt;&gt; 1
 Decimal:
  val=-4
  res=-2
 Binário:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111110
 NOTA: cópia do bit de sinal trocada para a esquerda

Expressão: -1 = -4 &gt;&gt; 2
 Decimal:
  val=-4
  res=-1
 Binário:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTA: move os bits para fora da direita

Expressão: -1 = -4 &gt;&gt; 3
 Decimal:
  val=-4
  res=-1
 Binário:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTA: mesmo resultado que acima; não se pode mover além do -1


--- MOVENDO BITS A ESQUERDA EM INTEIROS POSITIVOS ---
Expressão: 8 = 4 &lt;&lt; 1
 Decimal:
  val=4
  res=8
 Binário:
  val=00000000000000000000000000000100
  res=00000000000000000000000000001000
 NOTA: preenche com zeros o lado direito

Expressão: 1073741824 = 4 &lt;&lt; 28
 Decimal:
  val=4
  res=1073741824
 Binário:
  val=00000000000000000000000000000100
  res=01000000000000000000000000000000

Expressão: -2147483648 = 4 &lt;&lt; 29
 Decimal:
  val=4
  res=-2147483648
 Binário:
  val=00000000000000000000000000000100
  res=10000000000000000000000000000000
 NOTA: bit de sinal movido para fora

Expressão: 0 = 4 &lt;&lt; 30
 Decimal:
  val=4
  res=0
 Binário:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTA: bits movidos para fora da esquerda


--- MOVENDO BITS A ESQUERDA EM INTEIROS NEGATIVOS ---
Expressão: -8 = -4 &lt;&lt; 1
 Decimal:
  val=-4
  res=-8
 Binário:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111000
 NOTA: preenche com zeros o lado direito

Expressão: -2147483648 = -4 &lt;&lt; 29
 Decimal:
  val=-4
  res=-2147483648
 Binário:
  val=11111111111111111111111111111100
  res=10000000000000000000000000000000

Expressão: 0 = -4 &lt;&lt; 30
 Decimal:
  val=-4
  res=0
 Binário:
  val=11111111111111111111111111111100
  res=00000000000000000000000000000000
 NOTA: bits movidos para fora pela esquerda, incluindo o bit de sinal
</pre></div>
   </div>
   <div class="example-contents"><p>Saída do exemplo acima em máquinas de 64 bits:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>

--- MOVENDO BITS A DIREITA EM INTEIROS POSITIVOS ---
Expressão: 2 = 4 &gt;&gt; 1
 Decimal:
  val=4
  res=2
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000010
 NOTA: cópia do bit de sinal trocada para a esquerda

Expressão: 1 = 4 &gt;&gt; 2
 Decimal:
  val=4
  res=1
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000001

Expressão: 0 = 4 &gt;&gt; 3
 Decimal:
  val=4
  res=0
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTA: move os bits para fora da direita

Expressão: 0 = 4 &gt;&gt; 4
 Decimal:
  val=4
  res=0
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTA: mesmo resultado que acima; não se pode mover além do 0


--- MOVENDO BITS A DIREITA EM INTEIROS NEGATIVOS ---
Expressão: -2 = -4 &gt;&gt; 1
 Decimal:
  val=-4
  res=-2
 Binário:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111110
 NOTA: cópia do bit de sinal trocada para a esquerda

Expressão: -1 = -4 &gt;&gt; 2
 Decimal:
  val=-4
  res=-1
 Binário:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTA: move os bits para fora da direita

Expressão: -1 = -4 &gt;&gt; 3
 Decimal:
  val=-4
  res=-1
 Binário:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTA: mesmo resultado que acima; não se pode mover além do -1


--- MOVENDO BITS A ESQUERDA EM INTEIROS POSITIVOS ---
Expressão: 8 = 4 &lt;&lt; 1
 Decimal:
  val=4
  res=8
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000001000
 NOTA: preenche com zeros o lado direito

Expressão: 4611686018427387904 = 4 &lt;&lt; 60
 Decimal:
  val=4
  res=4611686018427387904
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0100000000000000000000000000000000000000000000000000000000000000

Expressão: -9223372036854775808 = 4 &lt;&lt; 61
 Decimal:
  val=4
  res=-9223372036854775808
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=1000000000000000000000000000000000000000000000000000000000000000
 NOTA: bit de sinal movido para fora

Expressão: 0 = 4 &lt;&lt; 62
 Decimal:
  val=4
  res=0
 Binário:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTA: bits movidos para fora da esquerda


--- MOVENDO BITS A ESQUERDA EM INTEIROS NEGATIVOS ---
Expressão: -8 = -4 &lt;&lt; 1
 Decimal:
  val=-4
  res=-8
 Binário:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111000
 NOTA: preenche com zeros o lado direito

Expressão: -9223372036854775808 = -4 &lt;&lt; 61
 Decimal:
  val=-4
  res=-9223372036854775808
 Binário:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1000000000000000000000000000000000000000000000000000000000000000

Expressão: 0 = -4 &lt;&lt; 62
 Decimal:
  val=-4
  res=0
 Binário:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTA: bits movidos para fora pela esquerda, incluindo o bit de sinal
</pre></div>
   </div>
  </div>
 </p>
 <div class="warning"><strong class="warning">Aviso</strong>
  <p class="para">
   Utilize as funções da extensão <a href="book.gmp.php" class="link">gmp</a> para manipulações
   de troca de bit em números maiores que <strong><code><a href="reserved.constants.php#constant.php-int-max">PHP_INT_MAX</a></code></strong>.
  </p>
 </div>

 <div class="sect2">
  <h3 class="title">Veja Também</h3>
  <p class="para">
   <ul class="simplelist">
    
    <li><span class="function"><a href="function.pack.php" class="function">pack()</a></span></li>
    <li><span class="function"><a href="function.unpack.php" class="function">unpack()</a></span></li>
    <li><span class="function"><a href="function.gmp-and.php" class="function">gmp_and()</a></span></li>
    <li><span class="function"><a href="function.gmp-or.php" class="function">gmp_or()</a></span></li>
    <li><span class="function"><a href="function.gmp-xor.php" class="function">gmp_xor()</a></span></li>
    <li><span class="function"><a href="function.gmp-testbit.php" class="function">gmp_testbit()</a></span></li>
    <li><span class="function"><a href="function.gmp-clrbit.php" class="function">gmp_clrbit()</a></span></li>
   </ul>
  </p>
 </div>
</div><?php manual_footer($setup); ?>