PHPでの数の扱い、計算について紹介します。どんな方法で記述するか、どんな点に気をつけないといけないのかを紹介します。
・整数と実数の表現方法
・算術演算子
・ビット演算子
PHPの整数は、普段私たちが使用している10進数表記のほか、コンピュータの世界でよく使う16進数、8進数を使って表すことができる。
<?php
// 10進数表記
echo 1234567890. "\n";
// 負数
echo -123456789. "\n";
// 8進数表記
echo 0123. "\n";
// 16進数表記
echo 0x1A. "\n";
出力結果
1234567890
-123456789
83
26
加えて、実数を表現するために、浮動小数点数を利用します。通常の、0.1234のような記述方法のほか、1.2e3(これは、1.2×10の3乗つまり1200を意味します)のような指数表現で表すこともできます。
<?php
// 浮動小数点数
echo 3.141592. "\n";
// 浮動小数点数(負数)
echo -3.141592. "\n";
// 指数形式表記
echo 1.2e3. "\n";
// 指数形式表記
echo 34E-3. "\n";
出力結果
3.141592
-3.141592
1200
0.034
PHPのマニュアルでは、整数型をinteger、浮動小数点型をfloatまたはdoubleとして表しています。コンピュータで数を表す場合、とうしても、表現できる数値の範囲が有限となります。一般的な32ビットPCの環境では、integerの表現範囲は、20億(-2147483648~2147483647)で、浮動小数点のfloat型では、10の38乗(制度は7桁)程度となります。
PHPで計算を行うには、算術演算子を利用します。算術演算子には、以下のような演算が利用できます。割り算の余り「%」はそれほど馴染みがなり演算ですが、数列に一回色を変えたいときや一定の周期で値を順に繰り返したいときなどのプログラミングではよく利用されます。
算術演算子
+ 足し算
- 引き算
* かけ算
/ わり算
% あまり算
また、計算の順番に置いては四則演算の優先順位が正しく反映されます。かけ算・わり算は足し算・引き算よりも優先され、丸括弧で囲まれた演算は、それよりも先に計算されます。
ビット演算子とは、ビットパターンまたは2進数を個々のビットの列として操作することです。PHPでは、ビット演算子を使うことで整数値の特定のビットを操作できます。一般的なWebアプリケーションで、ビット演算を使う機会はそれほど多くないと思いますのでここでは、どんな演算子が用意されているかだけ紹介します。
ビット演算子
$a & $b ビット類(AND)
$aおよび$bの両方にセットされているビットをセットする。
$a | $b ビット和(OR)
$aまたは$bの一方にセットされているビットをセットする。
$a ^ $b 排他的論理和(XOR)
$aまたは$bのどちらか一方にセットされており、両方にセットされていないビットがセットされる。
~ $a 否定(NOT)
$aでセットされているビットを0に、0のものは1に反転する
$a << $b 左シフト
$aのビットを左に$bビットシフトする(各シフトは(2をかける)ことを意味する)
$a >> $b 右シフト
$aのビットを右に$bビットシフトする(各シフトは(2で割る)ことを意味する)
PHPのシフト処理は算術シフトです。両端からあふれたビットは切り捨てられます。左シフトをすると右側にはゼロが埋められます。符号ビットは左端からあふれて消えます。右シフトの際には、符号ビットと同じ内容が左端から埋められます。
<?php
// 論理積
$a = 0xFF;
$b = 0xF0;
$c = $a & $b;
// 2進数で出力
echo sprintf("%08b\n", $c);
// 論理和
$a = 0xF0;
$b = 0x0F;
$c = $a | $b;
// 2進数で出力
echo sprintf("%08b\n", $c);
出力結果
11110000
11111111