コンピューターは0と1しか判別できないため、プログラムも0と1から出来ています。
少し理解するのが難しい、0と1しか入らない最小単位ビットとビット演算のお話。
本日は以下の内容でお話していきます。
【基礎】ビット演算ってなに?
【基礎】ビット演算子の種類
【実践】ビット演算をやってみよう
わかりやすく解説しますので、是非読んでください。
ビット演算とは
ビット演算について説明する前に、ビットについて説明します。
ビットについて既にご存知の方は読み飛ばしてください。
ビットについて
コンピューターは0と1しか判別不可能です。
この事実は時にPHPの学習者を惑わせます。
アルファベットや日本語もプログラムには記載している!と。
それは、アルファベットや日本語を0と1の組み合わせに変換しているのです。
いくつもの0と1の組み合わせによって様々な言葉や命令を表現しています。
冒頭で触れた通り、このコンピューターが理解できる最小単位のビットの中身は0と1です。
例えば、「2」という数字を表す時にはコンピューターには以下のように伝えます。
10
数字の10?って思った方もいるかもしれませんが、これは二進数です。
1桁ずつに2の重みがあり、2が増える毎に桁が一つ繰り上がるのが二進数です。
「6」は以下の表記でコンピューターに伝えます。
110
そして、この1桁が1ビットです。
「2」は二桁なので2ビット、「6」は三桁なので3ビットです。
ビット演算を理解するためには必要な事なので整理して理解してください。
ビット演算について
続いてビット演算について説明します。
前章で説明した通り、コンピューターに「6」を認識させるための表記は以下です。
110
これを演算子によって一桁左にずらすという命令をされて実行した場合以下になります。
100
三桁あるものを左に移動させるので四桁になりそうですが、溢れた四桁目は無視されます。
そして、一桁目には0が入ります。
これがビット演算です。
そして、ビット演算には桁を移動させるだけではなく様々な種類があります。
次章からその種類を説明します。
ビット演算子の種類
それではビット演算の命令である、ビット演算子について表形式で説明します。
次章で実際の使い方を記載しますので詳しくはそこで理解してください。
演算子 | 演算子名 |
---|---|
& | 論理積 |
| | 論理和 |
^ | 排他論理和 |
~ | 否定 |
<< | 左シフト |
>> | 右シフト |
色々種類がありますね。
それでは実際どのように使うのか、次章で実践しましょう。
ビット演算の方法
それでは各ビット演算子の使い方解説です。
論理積【&】
論理積は以下のように記述します。
$test1 & $test2
変数に二進数の以下の値を入れた場合で結果を考えます。
$test1→110(十進数では6)
$test2→101(十進数では5)
<?php $test1 = 6; $test2 = 5; echo decbin($test1 & $test2);
※PHPのビット演算は二進数では計算できないので十進数に変換後、decbinで二進数に変換させます。
論理積では1と1の場合は1でそれ以外は0となります。
各桁を比較しましょう。
110
101
↓
100
結果は100になりました。
論理和【|】
論理和は以下のように記述します。
$test1 | $test2
変数に二進数の以下の値を入れた場合で結果を考えます。
$test1→110(十進数では6)
$test2→100(十進数では4)
<?php $test1 = 6; $test2 = 4; echo decbin($test1 | $test2);
論理和では0と0の場合は0でそれ以外は1となります。
各桁を比較しましょう。
110
100
↓
110
結果は110になりました。
排他論理和【^】
排他論理和は以下のように記述します。
$test1 ^ $test2
変数に二進数の以下の値を入れた場合で結果を考えます。
$test1→110(十進数では6)
$test2→010(十進数では2)
<?php $test1 = 6; $test2 = 2; echo decbin($test1 ^ $test2);
排他論理和では両方同じ場合は0、それ以外は1となります。
各桁を比較しましょう。
110
010
↓
100
結果は100になりました。
否定【~】
否定は以下のように記述します。
~$test1
変数に二進数の以下の値を入れた場合で結果を考えます。
$test1→00000000000000000000000000000110(十進数では6)
<?php $test1 = 6; echo decbin(~$test1);
否定では全ての値が反転となります。
00000000000000000000000000000110
↓
11111111111111111111111111111001
結果は11111111111111111111111111111001になりました。
左シフト【<<】
左シフトは以下のように記述します。
$test1 << 1
右辺にずらす桁(数値や変数)を指定します。
変数に二進数の以下の値を入れた場合で結果を考えます。
$test1→0110(十進数では6)
左シフトでは指定された桁分、左に値をずらします。
<?php $test1 = 6; echo decbin($test1 << 1);
空いた桁には0を入れます。
0110
↓
1100
3桁目の1→4桁目に移動
2桁目の1→3桁目に移動
1桁目の0→2桁目に移動
1桁目に0が入る
最後に空いた1桁目に0を入れて結果は1100になりました。
右シフト【>>】
右シフトは以下のように記述します。
$test1 >> 2
右辺にずらす桁(数値や変数)を指定します。
変数に二進数の以下の値を入れた場合で結果を考えます。
$test1→110(十進数では6)
<?php $test1 = 6; echo decbin($test1 >> 2);
右シフトでは指定された桁分、右に値をずらします。
空いた桁には0を入れます。
110
↓
1
3桁目の1→1桁目に移動
2桁目の1→桁外に移動して無視される
1桁目の0→桁外に移動して無視される
結果は1になりました。
まとめ
本日は、PHPのビット演算についてお話しました。
プログラムを書く時に頻繁に必要にはなりませんが、知識として覚えておいてください。
それでは、また。