<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.operators.bitwise.php',
    1 => 'Bitwise',
    2 => 'Op&eacute;rateurs sur les bits',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => 'Les op&eacute;rateurs',
  ),
  'prev' => 
  array (
    0 => 'language.operators.assignment.php',
    1 => 'Affectation',
  ),
  'next' => 
  array (
    0 => 'language.operators.comparison.php',
    1 => 'Comparaison',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Opérateurs sur les bits</h2>
 
 <p class="simpara">
  Les opérateurs sur les bits permettent d&#039;évaluer et de
  manipuler des bits spécifiques dans un entier.
 </p>
 <table class="doctable table">
  <caption><strong>Les opérateurs sur les bits</strong></caption>
  
   <thead>
    <tr>
     <th>Exemple</th>
     <th>Nom</th>
     <th>Résultat</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td><strong class="userinput"><code>$a &amp; $b</code></strong></td>
     <td>And (Et)</td>
     <td>
      Les bits positionnés à 1 dans <var class="varname">$a</var> ET dans
      <var class="varname">$b</var> sont positionnés à 1.
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a | $b</code></strong></td>
     <td>Or (Ou)</td>
     <td>
      Les bits positionnés à 1 dans <var class="varname">$a</var> OU <var class="varname">$b</var>
      sont positionnés à 1.
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a ^ $b</code></strong></td>
     <td>Xor (ou exclusif)</td>
     <td>
      Les bits positionnés à 1 dans <var class="varname">$a</var> OU dans
      <var class="varname">$b</var> mais pas dans les deux sont positionnés à 1.
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>~ $a</code></strong></td>
     <td>Not (Non)</td>
     <td>
      Les bits qui sont positionnés à 1 dans <var class="varname">$a</var>
      sont positionnés à 0, et vice-versa.
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a &lt;&lt; $b</code></strong></td>
     <td>Décalage à gauche</td>
     <td>
      Décale les bits de <var class="varname">$a</var>, <var class="varname">$b</var> fois
      sur la gauche (chaque décalage équivaut à une multiplication par 2).
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a &gt;&gt; $b</code></strong></td>
     <td>Décalage à droite</td>
     <td>
      Décale les bits de <var class="varname">$a</var>, <var class="varname">$b</var> fois
      sur la droite (chaque décalage équivaut à une division par 2).
     </td>
    </tr>

   </tbody>
  
 </table>

 <p class="para">
  Le décalage de bits en PHP est arithmétique.
  Les bits qui sont décalés hors de l&#039;entier sont perdus.
  Les décalages à gauche font apparaître des zéros à droite,
  tandis que le bit de signe est décalé à gauche, ce qui signifie
  que le signe de l&#039;entier n&#039;est pas préservé.
  Les décalages à droite décalent aussi le bit de signe sur la
  droite, ce qui signifie que le signe est préservé.
 </p>

 <p class="para">
  Utiliser des parenthèses pour s&#039;assurer que la
  <a href="language.operators.precedence.php" class="link">précédence</a>
  voulue est bien appliquée. Par exemple,
  <code class="literal">$a &amp; $b == true</code> applique d&#039;abord
  l&#039;égalité, et ensuite le ET logique, alors que
  <code class="literal">($a &amp; $b) == true</code> applique d&#039;abord le
  ET logique, puis l&#039;égalité.
 </p>

 <p class="para">
  Si les deux opérandes pour les opérateurs <code class="literal">&amp;</code>,
  <code class="literal">|</code> et <code class="literal">^</code> sont des chaînes de caractères,
  alors l&#039;opération sera réalisée sur les valeurs ASCII des caractères et le
  résultat sera une chaîne de caractères. Dans tous les autres cas, les deux
  opérandes seront
  <a href="language.types.integer.php#language.types.integer.casting" class="link">converties en entier</a>
  et le résultat sera un entier.
 </p>
 <p class="para">
  Si l&#039;opérande pour l&#039;opérateur <code class="literal">~</code> est une chaîne
  de caractères, l&#039;opération sera effectuée sur les caractères ASCII composant
  la chaîne et le résultat sera une chaîne de caractères. Sinon l&#039;opérande et
  le résultat seront traités comme des entiers.
 </p>
 <p class="para">
  Les opérandes et le résultat des opérateurs <code class="literal">&lt;&lt;</code> et
  <code class="literal">&gt;&gt;</code> sont traités comme des entiers.
 </p>
 <p class="para">
  Le rapport d&#039;erreur de PHP utilise des champs de bits,
  qui sont une illustration de l&#039;extinction des bits.
  Pour afficher les erreurs, sauf les notices, les
  instructions du php.ini sont :
  <strong class="userinput"><code>E_ALL &amp; ~E_NOTICE</code></strong>
 </p>

 <p class="para">
  <div class="informalexample">
   <p class="para">
    <pre class="literallayout">
     Cela se comprend en comparant avec E_ALL :
     <span class="computeroutput">00000000000000000111011111111111</span>
     Puis en prenant la valeur de E_NOTICE...
     <span class="computeroutput">00000000000000000000000000001000</span>
     ... et en l&#039;inversant via <code class="literal">~</code>:
     <span class="computeroutput">11111111111111111111111111110111</span>
     Finalement, on utilise le ET logique (&amp;) pour lire les bits activés
     dans les deux valeurs :
     <span class="computeroutput">00000000000000000111011111110111</span>
    </pre>
   </p>

  </div>
 </p>
 <p class="para">
  Un autre moyen d&#039;arriver à ce résultat est d&#039;utiliser
  le OU exclusif (<code class="literal">^</code>), qui cherche
  les bits qui ne sont activés que dans l&#039;une ou l&#039;autre des
  valeurs, exclusivement :
  <strong class="userinput"><code>E_ALL ^ E_NOTICE</code></strong>
 </p>
 <p class="para">
  error_reporting peut aussi être utilisé pour
  illustrer l&#039;activation de bits. Pour afficher
  uniquement les erreurs et les erreurs recouvrables,
  on utilise :
  <strong class="userinput"><code>E_ERROR | E_RECOVERABLE_ERROR</code></strong>
 </p>
 <p class="para">
  <div class="informalexample">
   <p class="para">
    <pre class="literallayout">
     Cette approche combine E_ERROR
     <span class="computeroutput">00000000000000000000000000000001</span>
     et E_RECOVERABLE_ERROR
     <span class="computeroutput">00000000000000000001000000000000</span>
     Avec l&#039;opérateur OR (<code class="literal">|</code>) pour s&#039;assurer que
     les bits sont activés dans l&#039;une ou l&#039;autre valeur :
     <span class="computeroutput">00000000000000000001000000000001</span>
    </pre>
   </p>
  </div>
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Opérations sur les bits et les entiers</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 /> * Ignorez cette partie,<br /> * c'est juste du formatage pour clarifier les résultats<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 /> résultat       valeur        test<br /> ---------     ---------  -- ---------<br /></span><span style="color: #007700">EOH;<br /><br /><br /></span><span style="color: #FF8000">/*<br /> * Voici les exemples<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 Bitwise AND \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 Bitwise Inclusive OR \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 Bitwise Exclusive OR (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>L&#039;exemple ci-dessus va afficher :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
---------     ---------  -- ---------
 résultat       valeur        test
 ---------     ---------  -- ---------
 Bitwise AND
( 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)

 Bitwise Inclusive OR
( 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)

 Bitwise Exclusive OR (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>Exemple #2 Opération sur les bits et les chaînes</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">// Affiche '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">// Affiche le caractère d'effacement (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: #007700">; </span><span style="color: #FF8000">// Affiche les valeurs 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">// Affiche 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">// Affiche 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>Exemple #3 Décalage de bits sur les entiers</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 /> * Voici quelques exemples<br /> */<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"\n--- Décalages à droite sur des entiers positifs ---\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">'copie du bit de signe maintenant à gauche'</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">'des bits sont sortis par la droite'</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">'même résultat que ci-dessus : pas de décalage au-delà de 0'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- Décalages à droite sur des entiers négatifs ---\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">'copie du bit de signe maintenant à gauche'</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">'des bits sont sortis par la droite'</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">'même résultat que ci-dessus : pas de décalage au-delà de -1'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- Décalages à gauche sur des entiers positifs ---\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">'complément de zéros à droite'</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">'le bit de signe est sorti'</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">'des bits sont sortis à gauche'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- Décalages à gauche sur des entiers négatifs ---\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">'complément de zéros à droite'</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">'des bits sont sortis à gauche, y compris le bit de signe'</span><span style="color: #007700">);<br /><br /><br /></span><span style="color: #FF8000">/*<br /> * Ignorez cette section<br /> * Elle contient du code pour le formatage de cet exemple<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">"Expression : %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">" Décimal :\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">" Binaire :\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">" Note : </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>Résultat de l&#039;exemple ci-dessus sur une machine 32 bits :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>

--- Décalages à droite sur des entiers positifs ---
Expression : 2 = 4 &gt;&gt; 1
 Décimal :
  val=4
  res=2
 Binaire :
  val=00000000000000000000000000000100
  res=00000000000000000000000000000010
 Note : copie du bit de signe maintenant à gauche

Expression : 1 = 4 &gt;&gt; 2
 Décimal :
  val=4
  res=1
 Binaire :
  val=00000000000000000000000000000100
  res=00000000000000000000000000000001

Expression : 0 = 4 &gt;&gt; 3
 Décimal :
  val=4
  res=0
 Binaire :
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 Note : des bits sont sortis par la droite

Expression : 0 = 4 &gt;&gt; 4
 Décimal :
  val=4
  res=0
 Binaire :
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 Note : même résultat que ci-dessus : pas de décalage au-delà de 0


--- Décalages à droite sur des entiers négatifs ---
Expression : -2 = -4 &gt;&gt; 1
 Décimal :
  val=-4
  res=-2
 Binaire :
  val=11111111111111111111111111111100
  res=11111111111111111111111111111110
 Note : copie du bit de signe maintenant à gauche

Expression : -1 = -4 &gt;&gt; 2
 Décimal :
  val=-4
  res=-1
 Binaire :
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 Note : des bits sont sortis par la droite

Expression : -1 = -4 &gt;&gt; 3
 Décimal :
  val=-4
  res=-1
 Binaire :
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 Note : même résultat que ci-dessus : pas de décalage au-delà de -1


--- Décalages à gauche sur des entiers positifs ---
Expression : 8 = 4 &lt;&lt; 1
 Décimal :
  val=4
  res=8
 Binaire :
  val=00000000000000000000000000000100
  res=00000000000000000000000000001000
 Note : complément de zéros à droite

Expression : 1073741824 = 4 &lt;&lt; 28
 Décimal :
  val=4
  res=1073741824
 Binaire :
  val=00000000000000000000000000000100
  res=01000000000000000000000000000000

Expression : -2147483648 = 4 &lt;&lt; 29
 Décimal :
  val=4
  res=-2147483648
 Binaire :
  val=00000000000000000000000000000100
  res=10000000000000000000000000000000
 Note : le bit de signe est sorti

Expression : 0 = 4 &lt;&lt; 30
 Décimal :
  val=4
  res=0
 Binaire :
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 Note : des bits sont sortis à gauche


--- Décalages à gauche sur des entiers négatifs ---
Expression : -8 = -4 &lt;&lt; 1
 Décimal :
  val=-4
  res=-8
 Binaire :
  val=11111111111111111111111111111100
  res=11111111111111111111111111111000
 Note : complément de zéros à droite

Expression : -2147483648 = -4 &lt;&lt; 29
 Décimal :
  val=-4
  res=-2147483648
 Binaire :
  val=11111111111111111111111111111100
  res=10000000000000000000000000000000

Expression : 0 = -4 &lt;&lt; 30
 Décimal :
  val=-4
  res=0
 Binaire :
  val=11111111111111111111111111111100
  res=00000000000000000000000000000000
 Note : des bits sont sortis à gauche, y compris le bit de signe
</pre></div>
   </div>
   <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus sur une machine 64 bits :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>

--- Décalages à droite sur des entiers positifs ---
Expression : 2 = 4 &gt;&gt; 1
 Décimal :
  val=4
  res=2
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000010
 Note : copie du bit de signe maintenant à gauche

Expression : 1 = 4 &gt;&gt; 2
 Décimal :
  val=4
  res=1
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000001

Expression : 0 = 4 &gt;&gt; 3
 Décimal :
  val=4
  res=0
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 Note : des bits sont sortis par la droite

Expression : 0 = 4 &gt;&gt; 4
 Décimal :
  val=4
  res=0
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 Note : même résultat que ci-dessus : pas de décalage au-delà de 0


--- Décalages à droite sur des entiers négatifs ---
Expression : -2 = -4 &gt;&gt; 1
 Décimal :
  val=-4
  res=-2
 Binaire :
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111110
 Note : copie du bit de signe maintenant à gauche

Expression : -1 = -4 &gt;&gt; 2
 Décimal :
  val=-4
  res=-1
 Binaire :
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 Note : des bits sont sortis par la droite

Expression : -1 = -4 &gt;&gt; 3
 Décimal :
  val=-4
  res=-1
 Binaire :
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 Note : même résultat que ci-dessus : pas de décalage au-delà de -1


--- Décalage à gauche sur les entiers positifs ---
Expression : 8 = 4 &lt;&lt; 1
 Décimal :
  val=4
  res=8
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000001000
 Note : complément de zéros à droite

Expression : 4611686018427387904 = 4 &lt;&lt; 60
 Décimal :
  val=4
  res=4611686018427387904
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0100000000000000000000000000000000000000000000000000000000000000

Expression : -9223372036854775808 = 4 &lt;&lt; 61
 Décimal :
  val=4
  res=-9223372036854775808
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=1000000000000000000000000000000000000000000000000000000000000000
 Note : le bit de signe est sorti

Expression : 0 = 4 &lt;&lt; 62
 Décimal :
  val=4
  res=0
 Binaire :
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 Note : des bits sont sortis à gauche


--- Décalage à gauche sur les entiers négatifs ---
Expression : -8 = -4 &lt;&lt; 1
 Décimal :
  val=-4
  res=-8
 Binaire :
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111000
 Note : complément de zéros à droite

Expression : -9223372036854775808 = -4 &lt;&lt; 61
 Décimal :
  val=-4
  res=-9223372036854775808
 Binaire :
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1000000000000000000000000000000000000000000000000000000000000000

Expression : 0 = -4 &lt;&lt; 62
 Décimal :
  val=-4
  res=0
 Binaire :
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=0000000000000000000000000000000000000000000000000000000000000000
 Note : des bits sont sortis à gauche, y compris le bit de signe
</pre></div>
   </div>
  </div>
 </p>
 <div class="warning"><strong class="warning">Avertissement</strong>
  <p class="para">
   Utiliser les fonctions de l&#039;extension <a href="book.gmp.php" class="link">gmp</a>
   pour les manipulations sur les bits, lorsque les entiers dépassent
   <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">Voir aussi</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); ?>