BlueSkyDetector 2012-08-16 05:11:45

[PHP] ビットフラグの判定 このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

ある程度は正しく動くだろうけど、精度が足りないから結果がおかしくなるし、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]に要素が作成されてしまう。

コメント(6)

#1 math_neko 2012-08-16 12:36:05  

丸め誤差を知らない無知が故の過ち

#2 HarpoonArrow 2012-08-16 15:11:15  

丸め誤差というか内部的に実数で表現されてる数とビット演算しちゃった感じ?

#3 y_a_m_a_s_a_n 2012-08-17 15:18:57  

趣旨から外れちゃいますがコード以前にDB設計が間違っていると思われます

#4 math_neko 2012-08-22 06:52:31  

> コード以前にDB設計が間違っている

確かにそうですな。複数フラグがあるならそのフラグごとにカラム作るべきだと思う。

#5 Verna_Velna 2012-08-22 07:10:08  

1 << $i で良い所を exp(log(2)*$i))なんて格好つけて 結果としてバグってる所がアレだと思う。

#6 math_neko 2012-08-22 11:05:16  

> 1 << $i で良い所を exp(log(2)*$i) なんて格好つけて 結果としてバグってる所がアレ

全くもって…なまじ数学の知識があった故のウンコードですなw


このウンコードに臭った人は、こちらのウンコードにも臭ってます

[その他] HOW TO ABC..

このエントリーをはてなブックマークに追加

実際にあった某システムの超重要なマスター...

create table item_master (
 A varchar(2...

鑑賞する »

[Java] 専用機

このエントリーをはてなブックマークに追加

山田さん(仮名)専用機らしいことがクラス...

/**
 * My Army Knife
 * 20XX/XX/XX
 *...

鑑賞する »

[Java] フルHD推奨。

このエントリーをはてなブックマークに追加

画面の左側がわりと無駄な気がします。

public int hoge(){
    int result = 0;
...

鑑賞する »