スレッド表示 | フラット表示〕 全トピック 920 件中 201 番目 次≫ ≪前

エラー定数のビット演算について

created: 2006-08-18 00:34 | modified: 2006-08-19 13:00 | reply: 2

[3234] エラー定数のビット演算について

user: さとし | created: 2006-08-18 00:34
エラー処理はphp.iniのデフォルトでE_ALL&~E_NOTICEで
2039という事になっていますが、なぜこの様な計算をしているのでしょうか。
エラーレベル定数が1,2,3,4・・・としないで1,2,4,8・・・
のようになっている理由を教えて頂けないでしょうか。
恐らくmojaviのREQ_GET,REQ_POST定数も同じ様な理由からだと思います。
また、この手のビット演算の事を詳しく載せているサイトなどがあれば教えて下さい。
よろしくお願いします。
reply: 3236 返信 編集 削除

[3236] フラグ処理とビット演算

user: ゆうじ | created: 2006-08-19 02:36
こんばんわ。

1か0か、真か偽か、TrueかFalseか、有効か無効か、
このような二者択一の性格を持つデータを、
効率よく処理するため、1,2,4,8・・・のような値になってます。
いわゆるフラグ処理のためです。
良い機会なので私の認識の範囲で、
フラグ処理とビット演算について書いてみます。


例えば E_PARSE は10進数では 4 ですが、
2進数にすると、00000000100 となり、
3ビット目だけが立っていることがわかります。

他のエラーの定数についても、
どれか一つのビットが立つように値を定義してありますので、
対応するビットが立っているか否かを確かめれば、
それぞれの設定が有効か無効かを判断できるわけです。
10進数では見えなかったものが、2進数にすると見えきませんか。

このようにするのには2つ理由があります。
コンピュータ内部は全て2進数なので、ビット演算は処理が早い(時間節約)
1つの値でより多くの情報を受け渡しできる(メモリ節約)


ビット演算子の意味はこんな具合です。
OR演算子(|):AまたはBのいずれかが1ならば1(A | B == 1)
AND演算子(&):AとBどちらも1ならば1(A & B == 1)
NOT演算子(~):ビットを反転させる(1->0、0->1)


さて、実際のフラグ処理ですが、

値を指定する時は、次のどちらかのパターンを使います。
(1)有効にしたい値を OR演算子(|) で区切って指定する。
(2)有効にしたい値をNOT演算子(~)でビットを反転させたものと、
全て有効な E_ALL とを、AND演算子(&)で区切って指定する。

値を確認する時には、AND演算子(&) で比較すれば
個々の値が有効か無効か判断できます。

//
// エラーの値 $error を、2進数にした文字列を返す
//
function errorBinary ( $error )
{
$Binary = '';

// 値を確認する時はAND演算子(&)
// $Binary .= (E_STRICT & $error) ? '1': '0'; // 12桁目(PHP5 only)
$Binary .= (E_USER_NOTICE & $error) ? '1': '0'; // 11桁目
$Binary .= (E_USER_WARNING & $error) ? '1': '0'; // 10桁目
$Binary .= (E_USER_ERROR & $error) ? '1': '0'; // 9桁目
$Binary .= (E_COMPILE_WARNING & $error) ? '1': '0'; // 8桁目
$Binary .= (E_COMPILE_ERROR & $error) ? '1': '0'; // 7桁目
$Binary .= (E_CORE_WARNING & $error) ? '1': '0'; // 6桁目
$Binary .= (E_CORE_ERROR & $error) ? '1': '0'; // 5桁目
$Binary .= (E_NOTICE & $error) ? '1': '0'; // 4桁目
$Binary .= (E_PARSE & $error) ? '1': '0'; // 3桁目
$Binary .= (E_WARNING & $error) ? '1': '0'; // 2桁目
$Binary .= (E_ERROR & $error) ? '1': '0'; // 1桁目

return $Binary;
}

// (例1)有効にしたいものをひとつずつ指定するパターン
// 00000000001 or 00000000010 or 00000000100 = 00000000111
echo errorBinary(E_ERROR | E_WARNING | E_PARSE), '<br>';

// (例2)全てを有効にしておいて、特定の値を無効にするパターン
// 11111111111 and 11111110111 and 11111111101 = 11111110101
echo errorBinary(E_ALL & ~E_NOTICE & ~E_WARNING), '<br>';
Parent: 3234  reply: 3237 返信 編集 削除

[3237] Re.フラグ処理とビット演算

user: さとし | created: 2006-08-19 13:00
例えば E_PARSE は10進数では 4 ですが、
2進数にすると、00000000100 となり、
3ビット目だけが立っていることがわかります。
他のエラーの定数についても、
どれか一つのビットが立つように値を定義してあります
なるほど。
すべて2進数で書き出してみるべきでした。
すいません。

非常によく分かりました。
少し自分でテストしてみます。
サンプルまで用意して頂きありがとうございました。
Parent: 3236  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 201 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑