ある程度は正しく動くだろうけど、精度が足りないから結果がおかしくなるし、exp( )とかlog()とか重そうな関数使うのはどうかと。
他にも??と思うところはあるが。
$rq_severity = 33; //DBから読み出したフラグ情報
$severity = array();
//ビットフラグが立っている箇所ごとに配列の要素を作成
for($i=0; $i<6; $i++){
if($rq_severity & exp(log(2)*$i)) $severity[$i] = $i;
}
//$severity の [0]、[5]に要素が作成されるべきところが、[0]、[3]、[4]、[5]に要素が作成されてしまう。
丸め誤差というか内部的に実数で表現されてる数とビット演算しちゃった感じ?
趣旨から外れちゃいますがコード以前にDB設計が間違っていると思われます
1 << $i で良い所を exp(log(2)*$i))なんて格好つけて 結果としてバグってる所がアレだと思う。
> 1 << $i で良い所を exp(log(2)*$i) なんて格好つけて 結果としてバグってる所がアレ
全くもって…なまじ数学の知識があった故のウンコードですなw
丸め誤差を知らない無知が故の過ち