PHPでウェブの世界と繋がろう!
menu
ホーム > PHPの文法 > 4 演算子 > 4-6 ビット演算子

4-6 ビット演算子

Pocket

- 1 分ノート ! -

& ビットAND(論理積) | ビットOR(論理和)
^ ビットXOR(排他論理和) ~ ビット否定
<< 左シフト >> 右シフト
  • ビット演算子 は、整数値をビット値で演算
  • ビット は、コンピュータが処理する最小単位
  • ビット は、2進数の 0 と 1 に対応している

ビット演算子とは
POINT

  • ビット演算子 は、整数値をビット値で演算
  • ビット は、コンピュータが処理する最小単位
  • ビット は、2進数の 0 と 1 に対応している

ビットとは、コンピュータが処理する最小の単位です。ビット演算子は、オペランド(演算の対象となる値や変数のこと)の整数値をビット(2進数)に表現し、特定のビットを評価し演算を行います。つまり、整数値をビット値で演算します。

上記でも説明しましたが、ビットはコンピュータが処理する最小の単位です。ビットは2進数の 0 と 1 に対応しています。コンピュータでは通常、8ビット(1バイト)を1つの単位として扱い、1バイトは、0 から2進数の11111111(10進数の255)までが表現可能です。

進数を変換する関数

  • bindec() 2進数を10進数に変換する
  • decbin() 10進数を2進数に変換する

ビットAND(論理積)演算子を使用した簡単な例で考えて見ましょう。

$a = 3;$b = 35;
echo $a & $b;

結果は

3

となります。

ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)

2進法のそれぞれ対応するビットを比較します。
ビットAND(論理積)の場合、両方とも1の場合は1になります。そうでない場合は0になります。

000011
100011
————-
000011

000011(2進法)は3(10進法) となります。
ですので、結果は 3 となります。

ビット演算子の種類

ビット演算子の種類、優先順位、結合時の評価です。すべての演算子の種類や優先順位はこちらを参照下さい。

演算子 名前 優先順位 結合時の評価 結果
& ビットAND(論理積) 3 left $a & $b $a および $b の両方にセットされているビットがセットされます
| ビットOR(論理和) 1 left $a | $b $a または $b のどちらかにセットされているビットがセットされます
^ ビットXOR(排他論理和) 2 left $a ^ $b $a または $b のどちらか一方にセットされており、両方にセットされていないビットがセットされます
~ ビット否定 5 right ~ $a $a にセットされているビットはセットせず、そうでないものは逆にします
<< 左シフト 4 left $a << $b $a のビットを左に $b ビットシフトする (各シフトは "2をかける" ことを意味します)
>> 右シフト 4 left $a >> $b $a のビットを右に $b ビットシフトします (各シフトは "2で割る" ことを意味します)

計算の例

ビットAND(論理積)
$a = 3;$b = 35;
echo $a & $b;

結果は

3

となります。

ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)

2進法のそれぞれ対応するビットを比較します。
ビットAND(論理積)の場合、両方とも1の場合は1になります。そうでない場合は0になります。

000011
100011
————-
000011

000011(2進法)は3(10進法) です。

ビットOR(論理和)
$a = 3;$b = 35;
echo $a | $b;

結果は

35

となります。

ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)

2進法のそれぞれ対応するビットを比較します。
ビットOR(論理和)の場合、両方とも0の場合は0になります。そうでない場合は1になります。

000011
100011
————-
100011

100011(2進法)は35(10進法) です。

ビットXOR(排他論理和)
$a = 3;$b = 35;
echo $a ^ $b;

結果は

32

となります。

ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)

2進法のそれぞれ対応するビットを比較します。
ビットXOR(排他論理和)の場合、両方等しい場合は0になります。片方が0で片方が1の場合は1となります。

000011
100011
————-
100000

100000(2進法)は32(10進法) です。

ビット否定
$a = intval('1100', 2);
printf("%064b",  $a);
echo '<br/>';
printf("%064b", ~$a);

結果は

0000000000000000000000000000000000000000000000000000000000001100
1111111111111111111111111111111111111111111111111111111111110011

となります。

ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。

ビット否定演算子はビットを反転させます。1を0に0を1に変換します。

左シフト
$a = intval('1111', 2);
$b = intval('0001', 2);
echo decbin($a << $b);
&#91;/PHP&#93;
結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>11110</strong>
</div>
となります。

<strong class="clrPp6">左シフトの場合、左オペランドを2進法に変換し、右オペランドで指定したビット数分、左にシフトします。シフトした分を0で埋めます。両方のオペランドは演算前に整数に変換されます。</strong>

</div>


<a name="3-6"></a>
<h6>右シフト</h6>
<div id="txtBoxLms">
[PHP ruler="true" toolbar="true"]
$a = intval('1111', 2);
$b = intval('0001', 2);
echo decbin($a >> $b);

結果は

111

となります。

右シフトの場合、左オペランドを2進法に変換し、右オペランドで指定したビット数分右にシフトします。シフトした分を0で埋めます。両方のオペランドは演算前に整数に変換されます。

サンプルコード

– サンプル Click Here ! –

<h3>ビットAND(論理積)</h3>
<?php
$a = 3;$b = 35;
echo $a & $b;
?>

<h3>ビットOR(論理和)</h3>
<?php
$a = 3;$b = 35;
echo $a | $b;
?>

<h3>ビットXOR(排他論理和)</h3>
<?php
$a = 3;$b = 35;
echo $a ^ $b;
?>

<h3>ビット否定</h3>
<?php
$a = intval('1100', 2);
printf("%064b",  $a);
echo '<br/>';
printf("%064b", ~$a);
?>

<h3>左シフト</h3>
<?php
$a = intval('1111', 2);
$b = intval('0001', 2);
echo decbin($a << $b);
?>

<h3>右シフト</h3>
<?php
$a = intval('1111', 2);
$b = intval('0001', 2);
echo decbin($a >> $b);
?>

<h3>bindec() 2進数を10進数に変換する</h3>
<?php
echo bindec(100011);
?>

<h3>decbin() 10進数を2進数に変換する</h3>
<?php
echo decbin(35);
?>
実行結果
ビットAND(論理積)
3

ビットOR(論理和)
35

ビットXOR(排他論理和)
32

ビット否定
0000000000000000000000000000000000000000000000000000000000001100
1111111111111111111111111111111111111111111111111111111111110011

左シフト
11110

右シフト
111

bindec() 2進数を10進数に変換する
35

decbin() 10進数を2進数に変換する
100011

– サンプル Click Here ! –


タグ(=記事関連ワード)

日付

投稿日:2011年10月31日
最終更新日:2014年02月26日

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://www.tryphp.net/phpref-operators_bitwise/trackback/