UPDATE:2019年11月21日
PHP の ビット演算子
1 Minute Note
& | ビットAND(論理積) | | | ビットOR(論理和) |
^ | ビットXOR(排他論理和) | ~ | ビット否定 |
<< | 左シフト | >> | 右シフト |
- ビット演算子 は、整数値をビット値で演算
- ビット は、コンピュータが処理する最小単位
- ビット は、2進数の 0 と 1 に対応している
- 2進数 は、各桁で 0 と 1 のみ使用する(10進数だと各桁で0~9まで使用)
ビット演算子とは
- ビット演算子 は、整数値をビット値で演算
- ビット は、コンピュータが処理する最小単位
- ビット は、2進数の 0 と 1 に対応している
- 2進数 は、各桁で 0 と 1 のみ使用する(10進数だと各桁で0~9まで使用)
ビット(bit)とは
ビット(bit)とは、コンピュータが処理する最小の単位です。ビットは 0 と 1 に対応しており、2進数 で表現可能です。コンピューターの処理単位であるビットがなぜ 0 と 1 の2通りに対応するのか、それは、コンピューター内部のデジタルICが、直流電圧の強弱、5V(低い場合もある) か 0V の電気信号の入出力のみ対応させることで最適化を図ることができます。その上で、5V を数値の 1 で表し 0V を数値の 0 で表すことで成り立っているからです。これは、コンピューターで2進数が採用される最も大きな理由の1つです。その他に、ハードウェアへの実装の容易さや、演算の簡潔さなどが挙げられ、必然的に2進数を使用することになるのです。コンピューター内部では2進数ですべてのデータや命令を処理しています。因みに、人間は指が10本あるので10進法が広がったと言われています。
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ビット | 1 | 0, 1 の2通り |
2ビット | 11 | 00, 01, 10, 11 の4通り(2の2乗) |
3ビット | 111 | 000, 001, 010, 011, 100, 101, 110, 111 の8通り(2の3乗) |
4ビット | 1111 | 2の4乗 |
5ビット | 11111 | 2の5乗 |
6ビット | 111111 | 2の6乗 |
7ビット | 1111111 | 2の7乗 |
8ビット | 11111111 | 2の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(論理積)演算子を使用した簡単な例で考えて見ましょう。
1 2 3 4 | <?php $a = 3;$b = 35; echo $a & $b; ?> |
結果は
となります。
ビット演算子は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 となります。
1 2 3 4 | <?php $a = 100;$b = 200; echo $a & $b; ?> |
結果は
となります。
ビット列の比較
01100100
11001000
————
01000000
※2進数の1000000は10進数だと64になります。
1 2 3 4 | <?php $a = 1;$b = 255; echo $a & $b; ?> |
結果は
となります。
ビット列の比較
00000001
11111111
————-
00000001
※2進数の1は10進数だと1になります。
ビット演算子の種類
ビット演算子の種類、優先順位、結合時の評価です。すべての演算子の種類や優先順位はこちらを参照下さい。
演算子 | 名前 | 優先順位 | 結合時の評価 | 例 | 結果 |
---|---|---|---|---|---|
& | ビット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(論理積)
1 2 3 4 5 | <!-- サンプルコード --> <?php $a = 3;$b = 35; echo $a & $b; ?> |
結果は
となります。
ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)
2進法のそれぞれ対応するビットを比較します。
ビットAND(論理積)の場合、両方とも1の場合は1になります。そうでない場合は0になります。
000011
100011
————-
000011
000011(2進法)は3(10進法) です。
ビットOR(論理和)
1 2 3 4 5 | <!-- サンプルコード --> <?php $a = 3;$b = 35; echo $a | $b; ?> |
結果は
となります。
ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)
2進法のそれぞれ対応するビットを比較します。
ビットOR(論理和)の場合、両方とも0の場合は0になります。そうでない場合は1になります。
000011
100011
————-
100011
100011(2進法)は35(10進法) です。
ビットXOR(排他論理和)
1 2 3 4 5 | <!-- サンプルコード --> <?php $a = 3;$b = 35; echo $a ^ $b; ?> |
結果は
となります。
ビット演算子は10進法の整数値をコンピュータで処理するビット(2進法)で処理します。
3(10進法) は 000011ビット(2進法)
35(10進法) は 100011ビット(2進法)
2進法のそれぞれ対応するビットを比較します。
ビットXOR(排他論理和)の場合、両方等しい場合は0になります。片方が0で片方が1の場合は1となります。
000011
100011
————-
100000
100000(2進法)は32(10進法) です。
ビット否定
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php $a = intval('1100', 2); printf("%064b", $a); echo '<br>'; printf("%064b", ~$a); ?> |
※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。
結果は
1111111111111111111111111111111111111111111111111111111111110011
となります。
※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。奇数を指定しない場合10進数となります。
ビット否定演算子はビットを反転させます。1を0に0を1に変換します。
左シフト
1 2 3 4 5 6 | <!-- サンプルコード --> <?php $a = intval('1111', 2); $b = intval('0001', 2); echo decbin($a << $b); ?> |
※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。奇数を指定しない場合10進数となります。
結果は
となります。
左シフトの場合、左オペランドを2進法に変換し、右オペランドで指定したビット数分、左にシフトします。シフトした分を0で埋めます。両方のオペランドは演算前に整数に変換されます。
右シフト
1 2 3 4 5 6 | <!-- サンプルコード --> <?php $a = intval('1111', 2); $b = intval('0001', 2); echo decbin($a >> $b); ?> |
※intval(変数, 基数) は、変数を指定した基数(2進数、8進数、16進数)の整数型に変換します。奇数を指定しない場合10進数となります。
結果は
となります。
右シフトの場合、左オペランドを2進法に変換し、右オペランドで指定したビット数分右にシフトします。シフトした分を0で埋めます。両方のオペランドは演算前に整数に変換されます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <!-- サンプルコード --> <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); ?> |
3
ビットOR(論理和)
35
ビットXOR(排他論理和)
32
ビット否定
0000000000000000000000000000000000000000000000000000000000001100
1111111111111111111111111111111111111111111111111111111111110011
左シフト
11110
右シフト
111
bindec() 2進数を10進数に変換する
35
decbin() 10進数を2進数に変換する
100011
PHPの演算子
演算子の種類
種類 | 説明 |
算術演算子(代数演算子) | 算術演算子(代数演算子)は「足す」「引く」「掛ける」「割る」「余り」 |
---|---|
代入演算子 | 代入演算子は変数に値を代入したり、変数の値を更新する |
ビット演算子 | ビット演算子は、整数値をビット値で演算 ビットはコンピュータが処理する最小単位 |
比較演算子 | 比較演算子は左右のオペランドを比較する 結果と「true(真)」「false(偽)」で返す |
加算子(インクリメント演算子)・減算子(デクリメント演算子) | 加算子/減算子は値を1ずつ増減 |
文字列演算子 | 文字列演算子は結合と結合代入の2種類 |
論理演算子 | 論理演算子は論理値を評価し論理値を返す |
キャスト演算子 | キャスト演算子は右辺オペランドのデータ型を指定した型にする |
エラー制御演算子 | エラー制御演算子 @ を式の前に付けると式のエラーは無視される |
実行演算子 | PHPは実行演算子「“(バッククォート)」をサポート |
条件演算子(三項演算子) | (条件式) ? 真の場合の式 : 偽の場合の式; |
配列演算子 | 配列演算子は配列を統合したり比較したりする |
演算子の優先順位
- 演算子は計算の優先順位がある
PHPの演算子 早見表 | |||||
---|---|---|---|---|---|
優先 順位 | 演算子 | 名前 | 種類 | 結合時の 評価 | 働き |
19 | new | new | new | 結合なし | 新規オブジェクト作成 |
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 | ?? | NULL合体演算子 | NULL合体演算子 | right | |
6 | ? : | 三項演算子 (条件演算子) | 三項演算子 (条件演算子) | left | 条件演算子 |
5 | = += -= *= **= /= %= .= &= |= ^= ~= <<= >>= => | 代入 加算代入 減算代入 乗算代入 累乗代入 除算代入 乗算代入 連結代入 ビットAND代入 ビットOR代入 ビットXOR代入 ビット否定 左シフト代入 右シフト代入 配列値代入 | 代入演算子 | right | 操作結果の代入 |
4 | and | 論理積(AND) | 論理演算子 | left | 論理積(AND) |
3 | xor | 排他的論理和(XOR) | 論理演算子 | left | 排他的論理和(XOR) |
2 | or | 論理和(OR) | 論理演算子 | left | 論理和(OR) |
1 | , | さまざまな利用法 | さまざまな利用法 | left | リストの区切り |
タグ(=記事関連ワード)
日付
最終更新日:2019年11月21日