うす、豚野郎です。
最近、このQiitaの存在を会社の人にバラしたら
「おっす!豚野郎です!」といじられました。
さて、今回はBit演算子について書いていこうと思います。
プログラムでも2進数が使えることを初めて知りました。
公式ドキュメントに沿って書いていこうと思います。
https://www.php.net/manual/ja/language.operators.bitwise.php
・バージョン:PHP 7.4.29
順番的に以下の順番で書いていきます。
1.ビット積
2.ビット和
3.排他的論理和
4.否定
5.左シフト
6.右シフト
1. ビット積
$a および $b の両方にセットされているビットがセットされます
ここでは3と5を例に書いていきます。
10は二進数だと1010、15は二進数だと1111です。
この場合、ビット積は1010になるので、結果は10になるはずなので検証します。
<?php
$a = 10;
$b = 15;
echo $a & $b;
?>
結果
10
2. ビット和
$a または $b のどちらかにセットされているビットがセットされます
ここでは8と5を例に書いていきます。
8は二進数だと1000、5は二進数だと101です。
この場合、ビット和は1101になるので、結果は13になるはずなので検証します。
<?php
$a = 8;
$b = 5;
echo $a | $b;
?>
結果
13
3. 排他的論理和
$a または $b のどちらか一方にセットされており、両方にセットされていないビットがセットされます
ここでは3と5を例に書いていきます。
6は二進数だと110、3は二進数だと11です。
この場合、排他的論理和は101になるので、数字だと5になるはずなので検証します。
<?php
$a = 6;
$b = 3;
echo $a ^ $b;
?>
結果
5
4. 否定
$a にセットされているビットはセットせず、そうでないものは逆にします
ここでは8を例に書いていきます。
8は二進数だと1000です。
この場合、否定は0111になるので、数字だと7になるはずなので検証します。
<?php
$a = 8;
echo ~$a;
?>
結果
-9
なぜだ。
$aを9にすると、結果は-10になる。
2進数に変換してみます。
・参考:https://www.sejuku.net/blog/78679
<?php
$a = 8;
echo decbin(~$a);
?>
結果
1111111111111111111111111111111111111111111111111111111111110111
64桁になりました。
最初の4桁が否定になり、残りは0が反転され1になってます。
結果を7にしたい場合、以下の様にする必要があります。
<?php
$a = 8;
echo ~8 & 0b1111;
?>
結果
7
5. 左シフト
$a のビットを左に $b ビットシフトする (各シフトは "2をかける" ことを意味します)
ここでは5を例に書いていきます。
左シフトすると2倍になります。
この場合、左シフトは1010になるので、数字だと10になるはずなので検証します。
<?php
$a = 5;
$b = 1;
echo $a << $b;
?>
結果
10
6. 右シフト
$a のビットを右に $b ビットシフトします (各シフトは "2で割る" ことを意味します)
右へシフトすると1/2になります。
ここでは8を例に書いていきます。
この場合、右シフトは0100になるので、数字だと4になるはずなので検証します。
<?php
$a = 8;
$b = 1;
echo $a >> $b;
?>
結果
4
では、奇数だとどうなるでしょうか?
7は二進数で111になるので、どうなるか検証します。
予想は11になるため、3になります。(1/2ではありませんが)
<?php
$a = 7;
$b = 1;
echo $a >> $b;
?>
結果
3
想定通りでした。