<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.operators.bitwise.php',
    1 => 'ビット演算子',
    2 => 'ビット演算子',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => '演算子',
  ),
  'prev' => 
  array (
    0 => 'language.operators.assignment.php',
    1 => '代入演算子',
  ),
  'next' => 
  array (
    0 => 'language.operators.comparison.php',
    1 => '比較演算子',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    '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">ビット演算子</h2>
 
 <p class="simpara">
  ビット演算子は、整数値の特定のビットの評価や操作を行います。
 </p>
 <table class="doctable table">
  <caption><strong>ビット演算子</strong></caption>
  
   <thead>
    <tr>
     <th>例</th>
     <th>名前</th>
     <th>結果</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td><strong class="userinput"><code>$a &amp; $b</code></strong></td>
     <td>ビット積</td>
     <td><var class="varname">$a</var> および <var class="varname">$b</var> の両方にセットされているビットがセットされます</td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a | $b</code></strong></td>
     <td>ビット和</td>
     <td><var class="varname">$a</var> または <var class="varname">$b</var> のどちらかにセットされているビットがセットされます</td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a ^ $b</code></strong></td>
     <td>排他的論理和</td>
     <td><var class="varname">$a</var> または <var class="varname">$b</var> のどちらか一方にセットされており、両方にセットされていないビットがセットされます</td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>~ $a</code></strong></td>
     <td>否定</td>
     <td><var class="varname">$a</var> にセットされているビットはセットせず、そうでないものは逆にします</td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a &lt;&lt; $b</code></strong></td>
     <td>左シフト</td>
     <td><var class="varname">$a</var> のビットを左に <var class="varname">$b</var> ビットシフトする (各シフトは &quot;2をかける&quot;
  ことを意味します)
     </td>
    </tr>

    <tr>
     <td><strong class="userinput"><code>$a &gt;&gt; $b</code></strong></td>
     <td>右シフト</td>
     <td><var class="varname">$a</var> のビットを右に <var class="varname">$b</var> ビットシフトします (各シフトは &quot;2で割る&quot;
  ことを意味します)
     </td>
    </tr>

   </tbody>
  
 </table>

 <p class="para">
  PHP のシフト処理は算術シフトです。両端からあふれたビットは捨てられます。
  左シフトをすると右側にはゼロが埋められます。
  符号ビットは左端からあふれて消えます。
  つまり、オペランドの符号は維持されないということです。
  右シフトの際には、符号ビットと同じ内容が左端から埋められます。
  つまり、この場合はオペランドの符号が維持されます。
 </p>
 <p class="para">
  括弧を使うことで、望みどおりの
  <a href="language.operators.precedence.php" class="link">優先順位</a>
  で処理させることができます。たとえば、<code class="literal">$a &amp; $b == true</code>
  はまず等価かどうかを評価してからビット演算を行いますが
  <code class="literal">($a &amp; $b) == true</code>
  はまずビット演算を行ってから等価かどうかを評価します。
 </p>
 <p class="para">
  <code class="literal">&amp;</code>、<code class="literal">|</code> そして
  <code class="literal">^</code> 演算子の左右のオペランドが文字列の場合、その演算は、
  文字列を構成する文字の ASCII 値を使って行います。その結果は文字列になります。
  それ以外の場合は、左右のオペランドを
  <a href="language.types.integer.php#language.types.integer.casting" class="link">integer に変換</a>
  し、結果も integer になります。
 </p>
 <p class="para">
  <code class="literal">~</code> 演算子のオペランドが文字列の場合、その演算は、
  文字列を構成する文字の ASCII 値を使って行います。その結果は文字列になります。
  それ以外の場合は、オペランドや演算結果を integer として扱います。
 </p>
 <p class="para">
  <code class="literal">&lt;&lt;</code> および
  <code class="literal">&gt;&gt;</code> 演算子のオペランドとその結果は、常に integer として扱います。
 </p>
 <p class="para">
  PHP の ini 設定 error_reporting はビット値を用いています。
  これを用いて、特定のビットを落とす演算の例を見てみましょう。
  notice 以外のすべてのエラーを表示させるには、
  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">
まずは E_ALL。
<span class="computeroutput">00000000000000000111011111111111</span>
そして E_NOTICE...。
<span class="computeroutput">00000000000000000000000000001000</span>
... これを <code class="literal">~</code> で逆転させます。
<span class="computeroutput">11111111111111111111111111110111</span>
最後に AND (&amp;) を使い、両方ともビットが立っているところをみつけます。
<span class="computeroutput">00000000000000000111011111110111</span>
    </pre>
   </p>
  </div>
 </p>
 <p class="para">
  同じ結果を得るもうひとつの方法として、 XOR (<code class="literal">^</code>)
  を使ってどちらか一方だけ立っているビットを探すという方法もあります。
  <strong class="userinput"><code>E_ALL ^ E_NOTICE</code></strong>
 </p>
 <p class="para">
  error_reporting を使って、特定のビットを立てる処理の例を見てみましょう。
  通常のエラーとリカバー可能なエラーだけを表示させるには、次のようにします。
  <strong class="userinput"><code>E_ERROR | E_RECOVERABLE_ERROR</code></strong>
 </p>
 <p class="para">
  <div class="informalexample">
   <p class="para">
    <pre class="literallayout">
この処理は、 E_ERROR
<span class="computeroutput">00000000000000000000000000000001</span>
と
<span class="computeroutput">00000000000000000001000000000000</span>
を OR (<code class="literal">|</code>) 演算子でつないで、
少なくともどちらかのビットが立っているところを取得します。
<span class="computeroutput">00000000000000000001000000000001</span>
    </pre>
   </p>
  </div>
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>例1 整数値におけるビット AND、OR および XOR 演算</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 /> * このへんは無視してください。<br /> * たんに結果をきれいに表示させるためだけのものです。<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 /> result        value      op test<br /> ---------     ---------  -- ---------<br /></span><span style="color: #007700">EOH;<br /><br /><br /></span><span style="color: #FF8000">/*<br /> * ここからが本番<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>上の例の出力は以下となります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
 ---------     ---------  -- ---------
 result        value      op 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>例2 文字列でのビット XOR 演算</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">// 出力は '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">// 出力はバックスペース文字 (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">// 出力は、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">// 出力は 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">// 出力は 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>例3 整数値のビットシフト</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 /> * これが例です<br /> */<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"\n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---\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">'copy of sign bit shifted into left side'</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">'bits shift out right side'</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">'same result as above; can not shift beyond 0'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\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">'copy of sign bit shifted into left side'</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">'bits shift out right side'</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">'same result as above; can not shift beyond -1'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\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">'zeros fill in right side'</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">'sign bits get shifted out'</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 shift out left side'</span><span style="color: #007700">);<br /><br /><br />echo </span><span style="color: #DD0000">"\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\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">'zeros fill in right side'</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 shift out left side, including sign bit'</span><span style="color: #007700">);<br /><br /><br /></span><span style="color: #FF8000">/*<br /> * このへんは無視してください。<br /> * たんに結果をきれいに表示させるためだけのものです。<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">" 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">" Binary:\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>上の例の 32 ビットマシンでの出力は、このようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 &gt;&gt; 1
 Decimal:
val=4
res=2
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 &gt;&gt; 2
 Decimal:
val=4
res=1
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000001

Expression: 0 = 4 &gt;&gt; 3
 Decimal:
val=4
res=0
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 &gt;&gt; 4
 Decimal:
val=4
res=0
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0


--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 &gt;&gt; 1
 Decimal:
val=-4
res=-2
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 &gt;&gt; 2
 Decimal:
val=-4
res=-1
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 &gt;&gt; 3
 Decimal:
val=-4
res=-1
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1


--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 &lt;&lt; 1
 Decimal:
val=4
res=8
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000001000
 NOTE: zeros fill in right side

Expression: 1073741824 = 4 &lt;&lt; 28
 Decimal:
val=4
res=1073741824
 Binary:
val=00000000000000000000000000000100
res=01000000000000000000000000000000

Expression: -2147483648 = 4 &lt;&lt; 29
 Decimal:
val=4
res=-2147483648
 Binary:
val=00000000000000000000000000000100
res=10000000000000000000000000000000
 NOTE: sign bits get shifted out

Expression: 0 = 4 &lt;&lt; 30
 Decimal:
val=4
res=0
 Binary:
val=00000000000000000000000000000100
res=00000000000000000000000000000000
 NOTE: bits shift out left side


--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 &lt;&lt; 1
 Decimal:
val=-4
res=-8
 Binary:
val=11111111111111111111111111111100
res=11111111111111111111111111111000
 NOTE: zeros fill in right side

Expression: -2147483648 = -4 &lt;&lt; 29
 Decimal:
val=-4
res=-2147483648
 Binary:
val=11111111111111111111111111111100
res=10000000000000000000000000000000

Expression: 0 = -4 &lt;&lt; 30
 Decimal:
val=-4
res=0
 Binary:
val=11111111111111111111111111111100
res=00000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit
</pre></div>
   </div>
   <div class="example-contents"><p>上の例の 64 ビットマシンでの出力は、このようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 &gt;&gt; 1
 Decimal:
val=4
res=2
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 &gt;&gt; 2
 Decimal:
val=4
res=1
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000001

Expression: 0 = 4 &gt;&gt; 3
 Decimal:
val=4
res=0
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 &gt;&gt; 4
 Decimal:
val=4
res=0
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0


--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 &gt;&gt; 1
 Decimal:
val=-4
res=-2
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 &gt;&gt; 2
 Decimal:
val=-4
res=-1
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 &gt;&gt; 3
 Decimal:
val=-4
res=-1
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1


--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 &lt;&lt; 1
 Decimal:
val=4
res=8
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000001000
 NOTE: zeros fill in right side

Expression: 4611686018427387904 = 4 &lt;&lt; 60
 Decimal:
val=4
res=4611686018427387904
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0100000000000000000000000000000000000000000000000000000000000000

Expression: -9223372036854775808 = 4 &lt;&lt; 61
 Decimal:
val=4
res=-9223372036854775808
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=1000000000000000000000000000000000000000000000000000000000000000
 NOTE: sign bits get shifted out

Expression: 0 = 4 &lt;&lt; 62
 Decimal:
val=4
res=0
 Binary:
val=0000000000000000000000000000000000000000000000000000000000000100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side


--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 &lt;&lt; 1
 Decimal:
val=-4
res=-8
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1111111111111111111111111111111111111111111111111111111111111000
 NOTE: zeros fill in right side

Expression: -9223372036854775808 = -4 &lt;&lt; 61
 Decimal:
val=-4
res=-9223372036854775808
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=1000000000000000000000000000000000000000000000000000000000000000

Expression: 0 = -4 &lt;&lt; 62
 Decimal:
val=-4
res=0
 Binary:
val=1111111111111111111111111111111111111111111111111111111111111100
res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit
</pre></div>
   </div>
  </div>
 </p>
 <div class="warning"><strong class="warning">警告</strong>
  <p class="para">
   <strong><code><a href="reserved.constants.php#constant.php-int-max">PHP_INT_MAX</a></code></strong> を超える数のビット演算には、
   <a href="book.gmp.php" class="link">gmp</a> 拡張モジュールの関数を使いましょう。
  </p>
 </div>

 <div class="sect2">
  <h3 class="title">参考</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); ?>