menu
ホーム > PHPの文法 > 4 演算子 > PHP の ビット演算子
PHPリファレンス

UPDATE:2019年11月21日

PHP の ビット演算子

PHP の ビット演算子 | wepicks!

PHP4 PHP5 PHP7

1 Minute Note

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


ビット演算子とは

POINT

  • ビット演算子 は、整数値をビット値で演算
  • ビット は、コンピュータが処理する最小単位
  • ビット は、2進数の 0 と 1 に対応している
  • 2進数 は、各桁で 0 と 1 のみ使用する(10進数だと各桁で0~9まで使用)

ビット(bit)とは

ビット(bit)とは、コンピュータが処理する最小の単位です。ビットは 01 に対応しており、2進数 で表現可能です。コンピューターの処理単位であるビットがなぜ 0 と 1 の2通りに対応するのか、それは、コンピューター内部のデジタルICが、直流電圧の強弱、5V(低い場合もある) か 0V の電気信号の入出力のみ対応させることで最適化を図ることができます。その上で、5V を数値の 1 で表し 0V を数値の 0 で表すことで成り立っているからです。これは、コンピューターで2進数が採用される最も大きな理由の1つです。その他に、ハードウェアへの実装の容易さや、演算の簡潔さなどが挙げられ、必然的に2進数を使用することになるのです。コンピューター内部では2進数ですべてのデータや命令を処理しています。因みに、人間は指が10本あるので10進法が広がったと言われています。

1ビット:1桁の 0 と 1 の値で表現できる情報量の最小単位

1ビットだと1桁で 0 と 1 の2通りだけです。2ビットだと2桁で 0 と 1 と 10 と 11 の4通りになります。3ビットだと3桁、4ビットだと4桁となり、8ビット=1バイトは8桁になります。 2進数 は各桁を 0 と 1 で表現します。10進数 だと各桁を 0~9 で表現します。

ビット数最大値通り数
1ビット10, 1 の2通り
2ビット1100, 01, 10, 11 の4通り(2の2乗)
3ビット111000, 001, 010, 011, 100, 101, 110, 111 の8通り(2の3乗)
4ビット11112の4乗
5ビット111112の5乗
6ビット1111112の6乗
7ビット11111112の7乗
8ビット111111112の8乗 256通り

0と1の数字の組み合わせの並びをビット列と言います。コンピュータでは通常、1ビットを8つ並べて8ビット(1バイト)を1つの単位として扱い、8ビット(1バイト)は、0 から2進数の 11111111 (10進数の255)までが表現可能です。

ビット演算子は

ビット演算子は、オペランド(演算の対象となる値や変数のこと)の整数値をビット(bit)=2進数で表現し、特定のビットを評価し演算を行います。つまり、整数値をビット値で演算します。

進数を変換する関数

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

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

結果は

3

となります。

ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
10進法の 3 は 2進法で 11 となります。
10進法の 35 は 2進法で 100011 となります。
2進法のそれぞれ対応するビット列を比較します。
ビットAND(論理積)の場合、両方とも1の場合は1になります。そうでない場合は0になります。
11ビットを10011ビットと比較する場合は、以下のように000011と対応するビットを考えます。

ビット列の比較
000011
100011
————-
000011

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

結果は

64

となります。

ビット列の比較
01100100
11001000
————
01000000
※2進数の1000000は10進数だと64になります。

結果は

1

となります。

ビット列の比較
00000001
11111111
————-
00000001
※2進数の1は10進数だと1になります。

ビット演算子の種類

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

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

計算の例

ビットAND(論理積)

結果は

3

となります。

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

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

000011
100011
————-
000011

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

ビットOR(論理和)

結果は

35

となります。

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

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

000011
100011
————-
100011

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

ビットXOR(排他論理和)

結果は

32

となります。

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

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

000011
100011
————-
100000

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

ビット否定

※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。

結果は

0000000000000000000000000000000000000000000000000000000000001100
1111111111111111111111111111111111111111111111111111111111110011

となります。
※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。奇数を指定しない場合10進数となります。

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

左シフト

※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。奇数を指定しない場合10進数となります。

結果は

11110

となります。

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

右シフト

※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。奇数を指定しない場合10進数となります。

結果は

111

となります。

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

サンプルコード

– サンプル Click Here ! –

実行結果
ビットAND(論理積)
3

ビットOR(論理和)
35

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

ビット否定
0000000000000000000000000000000000000000000000000000000000001100
1111111111111111111111111111111111111111111111111111111111110011

左シフト
11110

右シフト
111

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

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

– サンプル Click Here ! –

PHPの演算子

演算子の種類

種類説明
算術演算子(代数演算子)算術演算子(代数演算子)は「足す」「引く」「掛ける」「割る」「余り」
代入演算子代入演算子は変数に値を代入したり、変数の値を更新する
ビット演算子ビット演算子は、整数値をビット値で演算 ビットはコンピュータが処理する最小単位
比較演算子比較演算子は左右のオペランドを比較する 結果と「true(真)」「false(偽)」で返す
加算子(インクリメント演算子)・減算子(デクリメント演算子)加算子/減算子は値を1ずつ増減
文字列演算子文字列演算子は結合と結合代入の2種類
論理演算子論理演算子は論理値を評価し論理値を返す
キャスト演算子キャスト演算子は右辺オペランドのデータ型を指定した型にする
エラー制御演算子エラー制御演算子 @ を式の前に付けると式のエラーは無視される
実行演算子PHPは実行演算子「“(バッククォート)」をサポート
条件演算子(三項演算子)(条件式) ? 真の場合の式 : 偽の場合の式;
配列演算子配列演算子は配列を統合したり比較したりする

演算子の優先順位

POINT

  • 演算子は計算の優先順位がある


PHPの演算子 早見表
優先
順位
演算子名前種類結合時の
評価
働き
19newnewnew結合なし新規オブジェクト作成
18[array()array()left配列の添字
17++ 加算子 加算子結合なし増加
  -- 減算子 減算子結合なし 減少
  ~ ビット否定 型 ビット演算子rightビット反転
  (int)
(float)
(string)
(array)
(object)
(bool)
キャスト 型 キャスト演算子right整数型へ変換
浮動小数点型へ変換
文字列型へ変換
配列型へ変換
オブジェクト型へ変換
論理型へ変換
  @ エラー制御 型 エラー制御演算子rightエラー制御
 instanceof結合なし 
 !論理否定(NOT) 論理演算子right論理否定(NOT)
16*
/
%
乗算
除算
剰余
代数演算子left乗算
除算
剰余
15+
-
.
加算
減算
文字列結合
代数演算子
代数演算子
文字列演算子
left加算
減算
文字列結合
14<<
>>
左シフト
右シフト
ビット演算子leftビット単位左シフト
ビット単位右シフト
13<
<=
>
>=
<>
より小さい
より小さいか等しい
より大きい
より大きいか等しい
等しくない
比較演算子結合なしより小さい
より小さいか等しい
より大きい
より大きいか等しい
等しくない
12==
!=
===
!==
等しい
等しくない
同じ
同じでない
比較演算子結合なし値が等しい
値が等しくない
値と型が同じ
値と型が同じでない
11& ビット積(AND) ビット演算子leftビット積(AND)
10^ビット排他的論理和(XOR) ビット演算子leftビット排他的論理和(XOR)
9|ビット和(OR) ビット演算子leftビット和(OR)
8&&論理積(AND) 論理演算子left論理積(AND)
7||論理和(OR) 論理演算子left論理和(OR)
6? : 三項演算子
(条件演算子)
三項演算子
(条件演算子)
left条件演算子
5 =
+=
-=
*=
/=
%=
.=
&=
|=
^=
~=
<<=
>>=
=>
代入
加算代入
減算代入
乗算代入
除算代入
乗算代入
連結代入
ビットAND代入
ビットOR代入
ビットXOR代入
ビット否定
左シフト代入
右シフト代入
配列値代入
代入演算子right操作結果の代入
4and 論理積(AND) 論理演算子left論理積(AND)
3xor排他的論理和(XOR) 論理演算子left排他的論理和(XOR)
2or論理和(OR) 論理演算子left論理和(OR)
1,さまざまな利用法さまざまな利用法leftリストの区切り


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

日付

公開日:2019年11月20日
最終更新日:2019年11月21日

関連記事

配列関数サンプル

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

この記事へのコメント

トラックバックurl

https://wepicks.net/phpref-operators_bitwise/trackback/

page top