echo ceil(123.45); //=> 124
1つの値に複合的な boolean 値をもたせたい場合にビット演算する場合がある。 PHP のどこかの入門書か何かに載っていたのか PHPer がよくこの実装を好んでしている気がする。
0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 15 1111 16
このように整数値に複数の boolean 値を持たせるという設計である。0から16までの数値で、4つのboolean 値を合成して持てる という発想である。一見うまいやり方に見えるが後から読む人間からすると、わかりにくすぎるのである。
間違いなく悪手である。class を作るか、最低でも JSON か何かで保持すればいいだろう。
現実問題としてこういうソースがあるので、そこでの話。
合成された値をビット演算で取り出したり合成した値を作る場合に整数値のビット演算をするのだがそこで2進数表記をしておくと どのビットを操作するのかがわかりやすいのでそれを使うとなんとなくわかりやすくはなる
0b
から書き始めることでそれが 2進数リテラルとなる。このようにビット演算することで4ビット目が立っていることが取り出せる。
if($a & 0b1000){ //hogehoge }
1ビット目と3ビット目の合成値が欲しい場合はこのようになる
$a = 0b0100 + 0b0001;
2進数リテラルは桁数を合わせるために上位ビットに無駄な0を置いても問題は無い
この場合はこのように表記したほうがよいか
$a = 0b0100 + 0b0001;
PHPで範囲のランダム値を得るにはmt_rand関数を使う。
$hoge = mt_rand(1, 100);
この場合は1~100(1と100を含む)範囲のランダム値を発生させる。
phpにはrand関数もあるのだが性能が悪いのでmt_randを使ったほうがいい。