PHP/数値操作

PHP/数値操作

バージョンと製造年月日

  • 2011-06-03
  • PHP5

小数を整数値に切り上げる

echo ceil(123.45); //=> 124

2進数リテラルを使う

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;

数字っぽい文字列から数値を作る

文字列から数値への変換はintval関数を使う

$num = intval("123");

PHP: intval - Manual

ある範囲の整数のランダム値を得る

PHPで範囲のランダム値を得るにはmt_rand関数を使う。

$hoge = mt_rand(1, 100);

この場合は1~100(1と100を含む)範囲のランダム値を発生させる。

phpにはrand関数もあるのだが性能が悪いのでmt_randを使ったほうがいい。

タグ

php/ope/number_ope.txt · 最終更新: 2019-12-24 17:16 by ore